Merge branch 'master' into concise-log

This commit is contained in:
James Yu 2023-01-07 16:08:31 +08:00 committed by GitHub
commit 24df55f3fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 133 additions and 623 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,183 +1,73 @@
{ {
"document": { "document": {
"name": "document", "snippet": "\\n$0"
"snippet": "\n$0"
},
"table": {
"name": "table"
}, },
"table": {},
"description": { "description": {
"name": "description", "snippet": "\\n\\t\\\\item[$1] $0"
"snippet": "\n\t\\item[$1] $0"
}, },
"enumerate": { "enumerate": {
"name": "enumerate", "snippet": "\\n\\t\\\\item $0"
"snippet": "\n\t\\item $0"
}, },
"itemize": { "itemize": {
"name": "itemize", "snippet": "\\n\\t\\\\item $0"
"snippet": "\n\t\\item $0"
},
"math": {
"name": "math"
},
"displaymath": {
"name": "displaymath"
},
"split": {
"name": "split"
}, },
"math": {},
"displaymath": {},
"split": {},
"array{}": { "array{}": {
"name": "array",
"detail": "array{cols}",
"snippet": "{${1:cols}}" "snippet": "{${1:cols}}"
}, },
"subarray{}": { "subarray{}": {
"name": "subarray",
"detail": "subarray{align}",
"snippet": "{${1:align}}" "snippet": "{${1:align}}"
}, },
"eqnarray": { "eqnarray": {},
"name": "eqnarray" "equation": {},
}, "equation*": {},
"equation": { "subequations": {},
"name": "equation" "subequations*": {},
}, "multline": {},
"equation*": { "multline*": {},
"name": "equation*" "gather": {},
}, "gather*": {},
"subequations": { "gathered": {},
"name": "subequations" "align": {},
}, "align*": {},
"subequations*": { "aligned": {},
"name": "subequations*" "alignedat": {},
}, "flalign": {},
"multline": { "flalign*": {},
"name": "multline" "xalignat": {},
}, "xalignat*": {},
"multline*": { "matrix": {},
"name": "multline*" "bmatrix": {},
}, "Bmatrix": {},
"gather": { "pmatrix": {},
"name": "gather" "vmatrix": {},
}, "Vmatrix": {},
"gather*": { "smallmatrix": {},
"name": "gather*" "definition": {},
}, "example": {},
"gathered": { "remark": {},
"name": "gathered" "lemma": {},
}, "theorem": {},
"align": { "corollary": {},
"name": "align" "proposition": {},
}, "proof": {},
"align*": { "cases": {},
"name": "align*" "center": {},
}, "flushleft": {},
"aligned": { "flushright": {},
"name": "aligned" "minipage": {},
}, "quotation": {},
"alignedat": { "quote": {},
"name": "alignedat" "verbatim": {},
}, "verse": {},
"flalign": { "picture": {},
"name": "flalign" "tabbing": {},
},
"flalign*": {
"name": "flalign*"
},
"xalignat": {
"name": "xalignat"
},
"xalignat*": {
"name": "xalignat*"
},
"matrix": {
"name": "matrix"
},
"bmatrix": {
"name": "bmatrix"
},
"Bmatrix": {
"name": "Bmatrix"
},
"pmatrix": {
"name": "pmatrix"
},
"vmatrix": {
"name": "vmatrix"
},
"Vmatrix": {
"name": "Vmatrix"
},
"smallmatrix": {
"name": "smallmatrix"
},
"definition": {
"name": "definition"
},
"example": {
"name": "example"
},
"remark": {
"name": "remark"
},
"lemma": {
"name": "lemma"
},
"theorem": {
"name": "theorem"
},
"corollary": {
"name": "corollary"
},
"proposition": {
"name": "proposition"
},
"proof": {
"name": "proof"
},
"cases": {
"name": "cases"
},
"center": {
"name": "center"
},
"flushleft": {
"name": "flushleft"
},
"flushright": {
"name": "flushright"
},
"minipage": {
"name": "minipage"
},
"quotation": {
"name": "quotation"
},
"quote": {
"name": "quote"
},
"verbatim": {
"name": "verbatim"
},
"verse": {
"name": "verse"
},
"picture": {
"name": "picture"
},
"tabbing": {
"name": "tabbing"
},
"tabular{}": { "tabular{}": {
"name": "tabular",
"detail": "tabular{cols}",
"snippet": "{${1:cols}}" "snippet": "{${1:cols}}"
}, },
"thebibliography": { "thebibliography": {},
"name": "thebibliography" "titlepage": {}
},
"titlepage": {
"name": "titlepage"
}
} }

View File

@ -65,7 +65,9 @@ export class Commander {
}) })
logger.log('Snippet data loaded.') logger.log('Snippet data loaded.')
}) })
.catch(err => logger.log(`Error reading data: ${err}.`)) .catch(err => {
this.extension.logger.addLogMessage(`Error reading data: ${err}.`)
})
} }
async build(skipSelection: boolean = false, rootFile: string | undefined = undefined, languageId: string | undefined = undefined, recipe: string | undefined = undefined) { async build(skipSelection: boolean = false, rootFile: string | undefined = undefined, languageId: string | undefined = undefined, recipe: string | undefined = undefined) {

View File

@ -3,7 +3,7 @@ import * as fs from 'fs'
import {latexParser} from 'latex-utensils' import {latexParser} from 'latex-utensils'
import type { Extension } from '../../main' import type { Extension } from '../../main'
import type { IProvider, ICompletionItem } from '../completion' import type { IProvider, ICompletionItem, PkgType } from '../completion'
import {CommandFinder, isTriggerSuggestNeeded} from './commandlib/commandfinder' import {CommandFinder, isTriggerSuggestNeeded} from './commandlib/commandfinder'
import {CmdEnvSuggestion, splitSignatureString, filterNonLetterSuggestions, filterArgumentHint} from './completerutils' import {CmdEnvSuggestion, splitSignatureString, filterNonLetterSuggestions, filterArgumentHint} from './completerutils'
import {CommandSignatureDuplicationDetector, CommandNameDuplicationDetector} from './commandlib/commandfinder' import {CommandSignatureDuplicationDetector, CommandNameDuplicationDetector} from './commandlib/commandfinder'
@ -15,8 +15,6 @@ import { getLogger } from '../../components/logger'
const logger = getLogger('Intelli', 'Command') const logger = getLogger('Intelli', 'Command')
type DataUnimathSymbolsJsonType = typeof import('../../../data/unimathsymbols.json') type DataUnimathSymbolsJsonType = typeof import('../../../data/unimathsymbols.json')
type DataCmdsJsonType = typeof import('../../../data/commands.json')
type DataTeXJsonType = typeof import('../../../data/packages/tex.json')
export type CmdType = { export type CmdType = {
command?: string, command?: string,
@ -27,7 +25,6 @@ export type CmdType = {
detail?: string, detail?: string,
documentation?: string, documentation?: string,
package?: string, package?: string,
label?: string,
postAction?: string postAction?: string
} }
@ -63,18 +60,17 @@ export class Command implements IProvider {
} }
initialize(environment: Environment) { initialize(environment: Environment) {
const defaultCommands = fs.readFileSync(`${this.extension.extensionRoot}/data/commands.json`, {encoding: 'utf8'}) const cmds = JSON.parse(fs.readFileSync(`${this.extension.extensionRoot}/data/commands.json`, {encoding: 'utf8'})) as {[key: string]: CmdType}
const defaultLaTeXMathSymbols = fs.readFileSync(`${this.extension.extensionRoot}/data/packages/tex.json`, {encoding: 'utf8'}) Object.keys(cmds).forEach(cmd => {
const cmds = JSON.parse(defaultCommands) as DataCmdsJsonType cmds[cmd].command = cmd
const maths: { [key: string]: CmdType } = (JSON.parse(defaultLaTeXMathSymbols) as DataTeXJsonType).cmds cmds[cmd].snippet = cmds[cmd].snippet || cmd
for (const key of Object.keys(maths)) { })
if (key.match(/\{.*?\}/)) { const maths = (JSON.parse(fs.readFileSync(`${this.extension.extensionRoot}/data/packages/tex.json`, {encoding: 'utf8'})) as PkgType).cmds
const ent = maths[key] Object.keys(maths).forEach(cmd => {
const newKey = key.replace(/\{.*?\}/, '') maths[cmd].command = cmd
delete maths[key] maths[cmd].snippet = maths[cmd].snippet || cmd
maths[newKey] = ent })
}
}
Object.assign(maths, cmds) Object.assign(maths, cmds)
const defaultEnvs = environment.getDefaultEnvs(EnvSnippetType.AsCommand) const defaultEnvs = environment.getDefaultEnvs(EnvSnippetType.AsCommand)
@ -237,7 +233,7 @@ export class Command implements IProvider {
item.command = item.command || itemKey item.command = item.command || itemKey
const backslash = item.command.startsWith(' ') ? '' : '\\' const backslash = item.command.startsWith(' ') ? '' : '\\'
const suggestion = new CmdEnvSuggestion( const suggestion = new CmdEnvSuggestion(
item.label || `${backslash}${item.command}`, `${backslash}${item.command}`,
item.package || 'latex', item.package || 'latex',
item.keyvals || [], item.keyvals || [],
item.keyvalindex === undefined ? -1 : item.keyvalindex, item.keyvalindex === undefined ? -1 : item.keyvalindex,

View File

@ -12,8 +12,6 @@ import { getLogger } from '../../components/logger'
const logger = getLogger('Intelli', 'Environment') const logger = getLogger('Intelli', 'Environment')
type DataEnvsJsonType = typeof import('../../../data/environments.json')
export type EnvType = { export type EnvType = {
name: string, // Name of the environment, what comes inside \begin{...} name: string, // Name of the environment, what comes inside \begin{...}
snippet?: string, // To be inserted after \begin{..} snippet?: string, // To be inserted after \begin{..}
@ -45,15 +43,19 @@ export class Environment implements IProvider {
} }
initialize() { initialize() {
const defaultEnvs = fs.readFileSync(`${this.extension.extensionRoot}/data/environments.json`, {encoding: 'utf8'}) const envs = JSON.parse(fs.readFileSync(`${this.extension.extensionRoot}/data/environments.json`, {encoding: 'utf8'})) as {[key: string]: EnvType}
const envs: { [key: string]: EnvType } = JSON.parse(defaultEnvs) as DataEnvsJsonType Object.keys(envs).forEach(key => {
envs[key].name = envs[key].name || key
envs[key].snippet = envs[key].snippet || ''
envs[key].detail = key
})
this.defaultEnvsAsCommand = [] this.defaultEnvsAsCommand = []
this.defaultEnvsForBegin = [] this.defaultEnvsForBegin = []
this.defaultEnvsAsName = [] this.defaultEnvsAsName = []
Object.keys(envs).forEach(key => { Object.keys(envs).forEach(key => {
this.defaultEnvsAsCommand.push(this.entryEnvToCompletion(key, envs[key], EnvSnippetType.AsCommand)) this.defaultEnvsAsCommand.push(this.entryEnvToCompletion(key, envs[key], EnvSnippetType.AsCommand))
this.defaultEnvsForBegin.push(this.entryEnvToCompletion(key, envs[key], EnvSnippetType.ForBegin)) this.defaultEnvsForBegin.push(this.entryEnvToCompletion(key, envs[key], EnvSnippetType.ForBegin))
this.defaultEnvsAsName.push(this.entryEnvToCompletion(key, envs[key], EnvSnippetType.AsName)) this.defaultEnvsAsName.push(this.entryEnvToCompletion(key, envs[key], EnvSnippetType.AsName))
}) })
return this return this

View File

@ -69,7 +69,8 @@ export class Completer implements vscode.CompletionItemProvider {
this.subImport = new SubImport(extension) this.subImport = new SubImport(extension)
this.glossary = new Glossary(extension) this.glossary = new Glossary(extension)
try { try {
this.loadDefaultItems() const environment = this.environment.initialize()
this.command.initialize(environment)
} catch (err) { } catch (err) {
logger.log(`Error reading data: ${err}.`) logger.log(`Error reading data: ${err}.`)
} }
@ -113,12 +114,6 @@ export class Completer implements vscode.CompletionItemProvider {
}) })
} }
private loadDefaultItems() {
// Make sure to initialize environment first
const environment = this.environment.initialize()
this.command.initialize(environment)
}
provideCompletionItems( provideCompletionItems(
document: vscode.TextDocument, document: vscode.TextDocument,
position: vscode.Position, position: vscode.Position,

View File

@ -12,9 +12,9 @@ import { CmdType } from '../../src/providers/completer/command'
import { PkgType } from '../../src/providers/completion' import { PkgType } from '../../src/providers/completion'
import { isTriggerSuggestNeeded } from '../../src/providers/completer/commandlib/commandfinder' import { isTriggerSuggestNeeded } from '../../src/providers/completer/commandlib/commandfinder'
function assertKeys(keys: string[], mendatory: string[], optional: string[] = [], message: string): void { function assertKeys(keys: string[], expected: string[] = [], message: string): void {
assert.ok( assert.ok(
keys.every(k => mendatory.includes(k) || optional.includes(k)) && mendatory.every(k => keys.includes(k)), keys.every(k => expected.includes(k)),
message message
) )
} }
@ -62,8 +62,7 @@ suite('Intellisense test suite', () => {
Object.keys(envs).forEach(name => { Object.keys(envs).forEach(name => {
assertKeys( assertKeys(
Object.keys(envs[name]), Object.keys(envs[name]),
['name'], ['name', 'snippet', 'detail'],
['snippet', 'detail'],
file + ': ' + JSON.stringify(envs[name]) file + ': ' + JSON.stringify(envs[name])
) )
}) })
@ -76,8 +75,7 @@ suite('Intellisense test suite', () => {
Object.keys(cmds).forEach(name => { Object.keys(cmds).forEach(name => {
assertKeys( assertKeys(
Object.keys(cmds[name]), Object.keys(cmds[name]),
['command'], ['command', 'snippet', 'documentation', 'detail', 'postAction'],
['snippet', 'documentation', 'detail', 'postAction', 'label'],
file + ': ' + JSON.stringify(cmds[name]) file + ': ' + JSON.stringify(cmds[name])
) )
}) })
@ -111,7 +109,6 @@ suite('Intellisense test suite', () => {
Object.keys(pkg.cmds).forEach(name => { Object.keys(pkg.cmds).forEach(name => {
assertKeys( assertKeys(
Object.keys(pkg.cmds[name]), Object.keys(pkg.cmds[name]),
[],
['command', 'snippet', 'option', 'keyvals', 'keyvalindex', 'documentation', 'detail'], ['command', 'snippet', 'option', 'keyvals', 'keyvalindex', 'documentation', 'detail'],
file + ': ' + JSON.stringify(pkg.cmds[name]) file + ': ' + JSON.stringify(pkg.cmds[name])
) )
@ -119,7 +116,6 @@ suite('Intellisense test suite', () => {
Object.keys(pkg.envs).forEach(name => { Object.keys(pkg.envs).forEach(name => {
assertKeys( assertKeys(
Object.keys(pkg.envs[name]), Object.keys(pkg.envs[name]),
[],
['name', 'snippet', 'detail', 'option', 'keyvals', 'keyvalindex'], ['name', 'snippet', 'detail', 'option', 'keyvals', 'keyvalindex'],
file + ': ' + JSON.stringify(pkg.envs[name]) file + ': ' + JSON.stringify(pkg.envs[name])
) )