|
@@ -1,6 +1,7 @@
|
|
import tokenizer from '@/scripts/parsing/tokenizer.js'
|
|
import tokenizer from '@/scripts/parsing/tokenizer.js'
|
|
-import {TokenStream, TokenType} from '../parsing/index.js'
|
|
|
|
|
|
+import { TokenStream } from '../parsing/index.js'
|
|
import {
|
|
import {
|
|
|
|
+ ClassConverter,
|
|
FunctionCall,
|
|
FunctionCall,
|
|
LinqSelect,
|
|
LinqSelect,
|
|
MapOrArrayAccess,
|
|
MapOrArrayAccess,
|
|
@@ -9,10 +10,9 @@ import {
|
|
VarDefine,
|
|
VarDefine,
|
|
VariableAccess
|
|
VariableAccess
|
|
} from '../parsing/ast.js'
|
|
} from '../parsing/ast.js'
|
|
-import {keywords, Parser} from '@/scripts/parsing/parser.js'
|
|
|
|
-import {Range} from 'monaco-editor'
|
|
|
|
|
|
+import { Parser } from '@/scripts/parsing/parser.js'
|
|
|
|
+import { Range } from 'monaco-editor'
|
|
import JavaClass from "./java-class"
|
|
import JavaClass from "./java-class"
|
|
-import RequestParameter from './request-parameter.js';
|
|
|
|
|
|
|
|
const findBestMatch = (node, row, col) => {
|
|
const findBestMatch = (node, row, col) => {
|
|
let expressions = node.expressions().filter(it => it);
|
|
let expressions = node.expressions().filter(it => it);
|
|
@@ -31,50 +31,51 @@ const findBestMatch = (node, row, col) => {
|
|
}
|
|
}
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
-const generateMethodDocument = (method, contents) => {
|
|
|
|
- contents.push({value: `${method.fullName}`})
|
|
|
|
|
|
+const generateMethodDocument = (prefix,method, contents) => {
|
|
|
|
+ contents.push({value: `${prefix}${method.fullName}`})
|
|
contents.push({value: `${method.comment}`})
|
|
contents.push({value: `${method.comment}`})
|
|
method.parameters.forEach((param, pIndex) => {
|
|
method.parameters.forEach((param, pIndex) => {
|
|
if (pIndex > 0 || !method.extension) {
|
|
if (pIndex > 0 || !method.extension) {
|
|
contents.push({value: `${param.name}:${(param.comment || param.type)}`})
|
|
contents.push({value: `${param.name}:${(param.comment || param.type)}`})
|
|
}
|
|
}
|
|
})
|
|
})
|
|
- contents.push({value: `返回值类型:${method.returnType}`})
|
|
|
|
|
|
+ contents.push({value: `返回类型:\`${method.returnType}\``})
|
|
}
|
|
}
|
|
const HoverProvider = {
|
|
const HoverProvider = {
|
|
provideHover: async (model, position) => {
|
|
provideHover: async (model, position) => {
|
|
let value = model.getValue()
|
|
let value = model.getValue()
|
|
let tokens = tokenizer(value);
|
|
let tokens = tokenizer(value);
|
|
- let row = position.lineNumber;
|
|
|
|
- let col = position.column;
|
|
|
|
- for (let index in tokens) {
|
|
|
|
- let token = tokens[index];
|
|
|
|
- if (token.getTokenType() === TokenType.Identifier && token.getSpan().inPosition(row, col) && keywords.indexOf(token.getText()) > -1) {
|
|
|
|
- let line = token.getSpan().getLine();
|
|
|
|
- return {
|
|
|
|
- range: new Range(line.lineNumber, line.startCol, line.endLineNumber, line.endCol + 1),
|
|
|
|
- contents: [{
|
|
|
|
- value: `关键字 **${token.getText()}**`
|
|
|
|
- }]
|
|
|
|
- };
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
let tokenStream = new TokenStream(tokens);
|
|
let tokenStream = new TokenStream(tokens);
|
|
let parser = new Parser(tokenStream)
|
|
let parser = new Parser(tokenStream)
|
|
let nodes = parser.parse(true);
|
|
let nodes = parser.parse(true);
|
|
- tokenStream.resetIndex(0)
|
|
|
|
- parser.linqLevel = 0;
|
|
|
|
- for (let index in nodes) {
|
|
|
|
- let node = nodes[index];
|
|
|
|
- if (node.getSpan().inPosition(row, col)) {
|
|
|
|
- let best = findBestMatch(node, row, col);
|
|
|
|
- let env = await parser.preprocessComplection(false,RequestParameter.environmentFunction() || {});
|
|
|
|
|
|
+ let input = model.getValueInRange({
|
|
|
|
+ startLineNumber: 1,
|
|
|
|
+ startColumn: 1,
|
|
|
|
+ endLineNumber: position.lineNumber,
|
|
|
|
+ endColumn: position.column
|
|
|
|
+ });
|
|
|
|
+ let index = input.length;
|
|
|
|
+ for (let i = 0, len = nodes.length; i < len; i++) {
|
|
|
|
+ let best = parser.findBestMatch(nodes[i], index)
|
|
|
|
+ if(best){
|
|
|
|
+ let env = await parser.processEnv(nodes)
|
|
let contents = [];
|
|
let contents = [];
|
|
let line = best.getSpan().getLine();
|
|
let line = best.getSpan().getLine();
|
|
if (best instanceof VarDefine) {
|
|
if (best instanceof VarDefine) {
|
|
let value = env[best.getVarName()];
|
|
let value = env[best.getVarName()];
|
|
contents.push({value: `变量:${best.getVarName()}`})
|
|
contents.push({value: `变量:${best.getVarName()}`})
|
|
contents.push({value: `类型:${value}`})
|
|
contents.push({value: `类型:${value}`})
|
|
|
|
+ } else if (best instanceof ClassConverter) {
|
|
|
|
+ if(best.convert === 'json'){
|
|
|
|
+ contents.push({value: '强制转换为`JSON`类型'})
|
|
|
|
+ }else if(best.convert === 'stringify'){
|
|
|
|
+ contents.push({value: '转换为`JSON`字符串'})
|
|
|
|
+ }else if(best.convert === 'sql'){
|
|
|
|
+ let args = best.args || []
|
|
|
|
+ contents.push({value: `等同于\`new SqlParameterValue(java.sql.Types.${args[0]?.span?.getText()?.toUpperCase()},${best.target.getSpan().getText()})\``})
|
|
|
|
+ }else{
|
|
|
|
+ contents.push({value: `转换为\`${best.convert}\``})
|
|
|
|
+ }
|
|
} else if (best instanceof VariableAccess) {
|
|
} else if (best instanceof VariableAccess) {
|
|
let value = env[best.getVariable()];
|
|
let value = env[best.getVariable()];
|
|
contents.push({value: `访问变量:${best.getVariable()}`})
|
|
contents.push({value: `访问变量:${best.getVariable()}`})
|
|
@@ -82,27 +83,32 @@ const HoverProvider = {
|
|
} else if (best instanceof MemberAccess) {
|
|
} else if (best instanceof MemberAccess) {
|
|
let javaType = await best.getTarget().getJavaType(env);
|
|
let javaType = await best.getTarget().getJavaType(env);
|
|
let clazz = await JavaClass.loadClass(javaType);
|
|
let clazz = await JavaClass.loadClass(javaType);
|
|
- let methods = JavaClass.findMethods(clazz);
|
|
|
|
- for (let m in methods) {
|
|
|
|
- let method = methods[m];
|
|
|
|
- if (method.name === best.member.getText()) {
|
|
|
|
- generateMethodDocument(method, contents);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ let memberName = best.member.getText()
|
|
|
|
+ JavaClass.findMethods(clazz).filter(method => method.name === memberName)
|
|
|
|
+ .forEach(method => generateMethodDocument(`${JavaClass.getSimpleClass(javaType)}.`,method, contents))
|
|
|
|
+ JavaClass.findEnums(clazz).filter(it => it === memberName).forEach(it => {
|
|
|
|
+ contents.push({value: `访问枚举:\`${javaType}.${memberName}\``})
|
|
|
|
+ })
|
|
|
|
+ JavaClass.findAttributes(clazz).filter(attr => attr.name === memberName).forEach(it => {
|
|
|
|
+ contents.push({value: `访问属性:\`${javaType}.${memberName}\``})
|
|
|
|
+ it.comment && contents.push({value: `${it.comment}`})
|
|
|
|
+ contents.push({value: `属性类型:` + `\`${it.type}\``})
|
|
|
|
+ })
|
|
|
|
+ line = best.member.getLine();
|
|
} else if (best instanceof FunctionCall) {
|
|
} else if (best instanceof FunctionCall) {
|
|
let target = best.target;
|
|
let target = best.target;
|
|
let functions = JavaClass.findFunction().filter(method => method.name === target.variable);
|
|
let functions = JavaClass.findFunction().filter(method => method.name === target.variable);
|
|
if (functions.length > 0) {
|
|
if (functions.length > 0) {
|
|
- generateMethodDocument(functions[0], contents);
|
|
|
|
|
|
+ generateMethodDocument('', functions[0], contents);
|
|
} else {
|
|
} else {
|
|
let value = env[target.variable];
|
|
let value = env[target.variable];
|
|
if (value && value.indexOf('@') === 0) {
|
|
if (value && value.indexOf('@') === 0) {
|
|
- var functionName = value.substring(1);
|
|
|
|
|
|
+ let functionName = value.substring(1);
|
|
let func = JavaClass.getOnlineFunction(functionName);
|
|
let func = JavaClass.getOnlineFunction(functionName);
|
|
if (func) {
|
|
if (func) {
|
|
let parameters = Array.isArray(func.parameter) ? func.parameter : JSON.parse(func.parameter || '[]');
|
|
let parameters = Array.isArray(func.parameter) ? func.parameter : JSON.parse(func.parameter || '[]');
|
|
parameters.forEach(it => it.comment = it.description);
|
|
parameters.forEach(it => it.comment = it.description);
|
|
- generateMethodDocument({
|
|
|
|
|
|
+ generateMethodDocument('', {
|
|
fullName: target.variable + " " + func.name,
|
|
fullName: target.variable + " " + func.name,
|
|
comment: func.description || '',
|
|
comment: func.description || '',
|
|
parameters,
|
|
parameters,
|