diff --git a/.vscode/settings.json b/.vscode/settings.json index d9091a02c..987ff083d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,7 +8,7 @@ "editor.formatOnSave": true }, "editor.codeActionsOnSave": { - "source.fixAll.eslint": true + "source.fixAll.eslint": "explicit" }, "typescript.tsdk": "node_modules/typescript/lib" } diff --git a/packages/pyright-internal/package-lock.json b/packages/pyright-internal/package-lock.json index 2ea1038bf..40486c21b 100644 --- a/packages/pyright-internal/package-lock.json +++ b/packages/pyright-internal/package-lock.json @@ -5,6 +5,7 @@ "requires": true, "packages": { "": { + "name": "pyright-internal", "version": "1.1.301", "license": "MIT", "dependencies": { diff --git a/packages/pyright-scip/index.js b/packages/pyright-scip/index.js old mode 100644 new mode 100755 diff --git a/packages/pyright-scip/src/treeVisitor.ts b/packages/pyright-scip/src/treeVisitor.ts index 69115d90e..177e6c228 100644 --- a/packages/pyright-scip/src/treeVisitor.ts +++ b/packages/pyright-scip/src/treeVisitor.ts @@ -238,6 +238,8 @@ export class TreeVisitor extends ParseTreeWalker { new scip.SymbolInformation({ symbol: symbol.value, documentation, + display_name: fileInfo.moduleName, + kind: scip.SymbolInformation.Kind.Module, }) ); } @@ -307,6 +309,8 @@ export class TreeVisitor extends ParseTreeWalker { new scip.SymbolInformation({ symbol: this.getScipSymbol(dec.node).value, documentation, + display_name: node.leftExpression.value, + kind: scip.SymbolInformation.Kind.Variable, }) ); } @@ -412,6 +416,8 @@ export class TreeVisitor extends ParseTreeWalker { symbol: this.getScipSymbol(node).value, documentation, relationships, + display_name: node.name.value, + kind: scip.SymbolInformation.Kind.Function, }) ); @@ -441,6 +447,8 @@ export class TreeVisitor extends ParseTreeWalker { new scip.SymbolInformation({ symbol: symbol.value, documentation: paramDocumentation, + display_name: paramNode.name?.value, + kind: scip.SymbolInformation.Kind.Parameter, }) ); @@ -720,7 +728,10 @@ export class TreeVisitor extends ParseTreeWalker { if (isDefinition) { // In this case, decl.node == node.parent - switch (decl.node.nodeType) { + // We need to store `decl.node` as a const here for the switch to apply type refinement + // to the value `declNode` within switch case bodies. + const declNode = decl.node; + switch (declNode.nodeType) { case ParseNodeType.Class: { const symbol = this.getScipSymbol(parent); @@ -730,7 +741,7 @@ export class TreeVisitor extends ParseTreeWalker { documentation.push('```python\n' + stub.join('\n') + '\n```'); } - const doc = ParseTreeUtils.getDocString(decl.node.suite.statements)?.trim(); + const doc = ParseTreeUtils.getDocString(declNode.suite.statements)?.trim(); if (doc) { documentation.push(convertDocStringToMarkdown(doc)); } @@ -785,10 +796,12 @@ export class TreeVisitor extends ParseTreeWalker { symbol: symbol.value, documentation, relationships, + display_name: declNode.name?.value, + kind: scip.SymbolInformation.Kind.Class, }) ); - this.pushNewOccurrence(node, this.getScipSymbol(decl.node), scip.SymbolRole.Definition, decl.node); + this.pushNewOccurrence(node, this.getScipSymbol(decl.node), scip.SymbolRole.Definition, declNode); break; } default: { @@ -1460,6 +1473,10 @@ export class TreeVisitor extends ParseTreeWalker { ); } + private assertUnreachable(x: never): never { + throw new Error("Didn't expect to get here"); + } + private emitSymbolInformationOnce( node: ParseNode, symbol: ScipSymbol, @@ -1471,11 +1488,16 @@ export class TreeVisitor extends ParseTreeWalker { } this.symbolInformationForNode.add(symbol.value); + const display_name = this.displayNameForParseNode(node); + const kind = this.kindForParseNode(node); + if (documentation) { this.document.symbols.push( new scip.SymbolInformation({ symbol: symbol.value, documentation, + display_name, + kind, }) ); @@ -1495,6 +1517,8 @@ export class TreeVisitor extends ParseTreeWalker { new scip.SymbolInformation({ symbol: symbol.value, documentation: _formatHover(hoverResult!), + display_name, + kind, }) ); @@ -1515,10 +1539,360 @@ export class TreeVisitor extends ParseTreeWalker { new scip.SymbolInformation({ symbol: symbol.value, documentation: [docs], + display_name, + kind, }) ); } + private displayNameForParseNode(node: ParseNode): string | undefined { + switch (node.nodeType) { + case ParseNodeType.Error: + break; + + case ParseNodeType.Argument: + return node.name?.value; + case ParseNodeType.Assert: + break; + case ParseNodeType.Assignment: + break; + case ParseNodeType.AssignmentExpression: + break; + case ParseNodeType.AugmentedAssignment: + break; + case ParseNodeType.Await: + break; + case ParseNodeType.BinaryOperation: + break; + case ParseNodeType.Break: + break; + case ParseNodeType.Call: + break; + + case ParseNodeType.Class: + return node.name?.value; + case ParseNodeType.Constant: + break; + case ParseNodeType.Continue: + break; + case ParseNodeType.Decorator: + break; + case ParseNodeType.Del: + break; + case ParseNodeType.Dictionary: + break; + case ParseNodeType.DictionaryExpandEntry: + break; + case ParseNodeType.DictionaryKeyEntry: + break; + case ParseNodeType.Ellipsis: + break; + case ParseNodeType.If: + break; + + case ParseNodeType.Import: + break; + case ParseNodeType.ImportAs: + return node.alias?.value; + case ParseNodeType.ImportFrom: + break; + case ParseNodeType.ImportFromAs: + return node.name?.value; + case ParseNodeType.Index: + break; + case ParseNodeType.Except: + break; + case ParseNodeType.For: + break; + case ParseNodeType.FormatString: + break; + case ParseNodeType.Function: + return node.name?.value; + case ParseNodeType.Global: + break; + + case ParseNodeType.Lambda: + break; + case ParseNodeType.List: + break; + case ParseNodeType.ListComprehension: + break; + case ParseNodeType.ListComprehensionFor: + break; + case ParseNodeType.ListComprehensionIf: + break; + case ParseNodeType.MemberAccess: + break; + case ParseNodeType.Module: + break; + case ParseNodeType.ModuleName: + break; + case ParseNodeType.Name: + return node.value; + case ParseNodeType.Nonlocal: + break; + + case ParseNodeType.Number: + break; + case ParseNodeType.Parameter: + return node.name?.value; + case ParseNodeType.Pass: + break; + case ParseNodeType.Raise: + break; + case ParseNodeType.Return: + break; + case ParseNodeType.Set: + break; + case ParseNodeType.Slice: + break; + case ParseNodeType.StatementList: + break; + case ParseNodeType.StringList: + break; + case ParseNodeType.String: + break; + + case ParseNodeType.Suite: + break; + case ParseNodeType.Ternary: + break; + case ParseNodeType.Tuple: + break; + case ParseNodeType.Try: + break; + case ParseNodeType.TypeAnnotation: + break; + case ParseNodeType.UnaryOperation: + break; + case ParseNodeType.Unpack: + break; + case ParseNodeType.While: + break; + case ParseNodeType.With: + break; + case ParseNodeType.WithItem: + break; + + case ParseNodeType.Yield: + break; + case ParseNodeType.YieldFrom: + break; + case ParseNodeType.FunctionAnnotation: + break; + case ParseNodeType.Match: + break; + case ParseNodeType.Case: + break; + case ParseNodeType.PatternSequence: + break; + case ParseNodeType.PatternAs: + break; + case ParseNodeType.PatternLiteral: + break; + case ParseNodeType.PatternClass: + break; + case ParseNodeType.PatternCapture: + break; + + case ParseNodeType.PatternMapping: + break; + case ParseNodeType.PatternMappingKeyEntry: + break; + case ParseNodeType.PatternMappingExpandEntry: + break; + case ParseNodeType.PatternValue: + break; + case ParseNodeType.PatternClassArgument: + break; + case ParseNodeType.TypeParameter: + break; + case ParseNodeType.TypeParameterList: + break; + case ParseNodeType.TypeAlias: + break; + + default: + return this.assertUnreachable(node); + } + return `unimplemented: ${node.nodeType}`; + } + + private kindForParseNode(node: ParseNode): scip.SymbolInformation.Kind { + switch (node.nodeType) { + case ParseNodeType.Error: + break; + + case ParseNodeType.Argument: + return scip.SymbolInformation.Kind.Parameter; + case ParseNodeType.Assert: + break; + case ParseNodeType.Assignment: + break; + case ParseNodeType.AssignmentExpression: + break; + case ParseNodeType.AugmentedAssignment: + break; + case ParseNodeType.Await: + break; + case ParseNodeType.BinaryOperation: + break; + case ParseNodeType.Break: + break; + case ParseNodeType.Call: + break; + + case ParseNodeType.Class: + return scip.SymbolInformation.Kind.Class; + case ParseNodeType.Constant: + return scip.SymbolInformation.Kind.Constant; + case ParseNodeType.Continue: + break; + case ParseNodeType.Decorator: + break; + case ParseNodeType.Del: + break; + case ParseNodeType.Dictionary: + break; + case ParseNodeType.DictionaryExpandEntry: + break; + case ParseNodeType.DictionaryKeyEntry: + break; + case ParseNodeType.Ellipsis: + break; + case ParseNodeType.If: + break; + + case ParseNodeType.Import: + return scip.SymbolInformation.Kind.Library; // I guess? + case ParseNodeType.ImportAs: + return scip.SymbolInformation.Kind.Library; // I guess? + case ParseNodeType.ImportFrom: + return scip.SymbolInformation.Kind.Library; // I guess? + case ParseNodeType.ImportFromAs: + return scip.SymbolInformation.Kind.Library; // I guess? + case ParseNodeType.Index: + break; + case ParseNodeType.Except: + break; + case ParseNodeType.For: + break; + case ParseNodeType.FormatString: + break; + case ParseNodeType.Function: + return scip.SymbolInformation.Kind.Function; + case ParseNodeType.Global: + break; + + case ParseNodeType.Lambda: + break; + case ParseNodeType.List: + break; + case ParseNodeType.ListComprehension: + break; + case ParseNodeType.ListComprehensionFor: + break; + case ParseNodeType.ListComprehensionIf: + break; + case ParseNodeType.MemberAccess: + break; + case ParseNodeType.Module: + break; + case ParseNodeType.ModuleName: + break; + case ParseNodeType.Name: + // Empirically I think this refers to a named parameter in a method call; + // e.g. in foo(x=5), the `x` token is a `Name` node. + return scip.SymbolInformation.Kind.ParameterLabel; + case ParseNodeType.Nonlocal: + break; + + case ParseNodeType.Number: + break; + case ParseNodeType.Parameter: + return scip.SymbolInformation.Kind.Parameter; + case ParseNodeType.Pass: + break; + case ParseNodeType.Raise: + break; + case ParseNodeType.Return: + break; + case ParseNodeType.Set: + break; + case ParseNodeType.Slice: + break; + case ParseNodeType.StatementList: + break; + case ParseNodeType.StringList: + break; + case ParseNodeType.String: + return scip.SymbolInformation.Kind.String; + + case ParseNodeType.Suite: + break; + case ParseNodeType.Ternary: + break; + case ParseNodeType.Tuple: + break; + case ParseNodeType.Try: + break; + case ParseNodeType.TypeAnnotation: + break; + case ParseNodeType.UnaryOperation: + break; + case ParseNodeType.Unpack: + break; + case ParseNodeType.While: + break; + case ParseNodeType.With: + break; + case ParseNodeType.WithItem: + break; + + case ParseNodeType.Yield: + break; + case ParseNodeType.YieldFrom: + break; + case ParseNodeType.FunctionAnnotation: + break; + case ParseNodeType.Match: + break; + case ParseNodeType.Case: + break; + case ParseNodeType.PatternSequence: + break; + case ParseNodeType.PatternAs: + break; + case ParseNodeType.PatternLiteral: + break; + case ParseNodeType.PatternClass: + break; + case ParseNodeType.PatternCapture: + break; + + case ParseNodeType.PatternMapping: + break; + case ParseNodeType.PatternMappingKeyEntry: + break; + case ParseNodeType.PatternMappingExpandEntry: + break; + case ParseNodeType.PatternValue: + break; + case ParseNodeType.PatternClassArgument: + break; + case ParseNodeType.TypeParameter: + break; + case ParseNodeType.TypeParameterList: + break; + case ParseNodeType.TypeAlias: + break; + + default: + return this.assertUnreachable(node); + } + return scip.SymbolInformation.Kind.UnspecifiedKind; + } + // this is copied from TypeEvaluator -> getAliasedSymbolTypeForName // but it just was not exposed as such. private getAliasedSymbolTypeForName( diff --git a/packages/pyright/package-lock.json b/packages/pyright/package-lock.json index 4092c0c2c..83e166a82 100644 --- a/packages/pyright/package-lock.json +++ b/packages/pyright/package-lock.json @@ -5,6 +5,7 @@ "requires": true, "packages": { "": { + "name": "pyright", "version": "1.1.301", "license": "MIT", "bin": { diff --git a/packages/vscode-pyright/package-lock.json b/packages/vscode-pyright/package-lock.json index 7cfdc584d..e5798cd78 100644 --- a/packages/vscode-pyright/package-lock.json +++ b/packages/vscode-pyright/package-lock.json @@ -5,6 +5,7 @@ "requires": true, "packages": { "": { + "name": "vscode-pyright", "version": "1.1.301", "license": "MIT", "dependencies": {