Skip to content

Commit 3cbe364

Browse files
authored
Added support in Golang (#100)
1 parent a879950 commit 3cbe364

File tree

10 files changed

+115
-20
lines changed

10 files changed

+115
-20
lines changed

src/extension.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@ import { HotspotMarkerDecorator } from './decorators/hotspotMarkerDecorator';
1515
import { EditorHelper } from './services/EditorHelper';
1616
import { CodeInspector } from './services/codeInspector';
1717
import { VsCodeDebugInstrumentation } from './instrumentation/vscodeInstrumentation';
18+
import { GoLanguageExtractor } from './services/languages/go/languageExtractor';
1819

1920
export async function activate(context: vscode.ExtensionContext)
2021
{
2122
const supportedLanguages = [
2223
new PythonLanguageExtractor(),
23-
new CSharpLanguageExtractor()
24+
new CSharpLanguageExtractor(),
25+
new GoLanguageExtractor()
2426
];
2527
const supportedSourceControls = [
2628
new Git()

src/services/languages/csharp/methodExtractor.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { IMethodExtractor, SymbolInfo } from "../extractors";
55

66
export class CSharpMethodExtractor implements IMethodExtractor
77
{
8-
public extractMethods(document: vscode.TextDocument, docSymbols: DocumentSymbol[]): SymbolInfo[] {
8+
public async extractMethods(document: vscode.TextDocument, docSymbols: DocumentSymbol[]): Promise<SymbolInfo[]> {
99
const symbolInfos = this.extractFunctions(document.uri, document.uri.toModulePath(), '', docSymbols);
1010
return symbolInfos;
1111
}
@@ -42,7 +42,7 @@ export class CSharpMethodExtractor implements IMethodExtractor
4242
id,
4343
name: funcName,
4444
codeLocation: namespace,
45-
displayName: namespace + "." + funcName,
45+
displayName: namespace.split('.').lastOrDefault() + "." + funcName,
4646
range,
4747
documentUri: uri,
4848
});

src/services/languages/extractors.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ export class SpanInfo implements CodeObjectInfo{
4343

4444

4545
export interface IMethodExtractor {
46-
extractMethods(document: vscode.TextDocument, docSymbols: DocumentSymbol[]) : SymbolInfo[];
46+
extractMethods(
47+
document: vscode.TextDocument,
48+
docSymbols: DocumentSymbol[],
49+
) : Promise<SymbolInfo[]>;
4750
}
4851

4952
export interface IEndpointExtractor {
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import * as vscode from 'vscode';
2+
import { CodeInspector } from '../../codeInspector';
3+
import { IEndpointExtractor, ILanguageExtractor, IMethodExtractor, ISpanExtractor } from '../extractors';
4+
import { GoMethodExtractor } from './methodExtractor';
5+
6+
7+
8+
export class GoLanguageExtractor implements ILanguageExtractor
9+
{
10+
public requiredExtensionLoaded: boolean = false;
11+
12+
public get requiredExtensionId(): string {
13+
return 'golang.go';
14+
}
15+
16+
public get documentFilter(): vscode.DocumentFilter {
17+
return { scheme: 'file', language: 'go' };
18+
}
19+
20+
public get methodExtractors(): IMethodExtractor[] {
21+
return [
22+
new GoMethodExtractor()
23+
];
24+
}
25+
26+
public getEndpointExtractors(codeInspector: CodeInspector): IEndpointExtractor[] {
27+
return [];
28+
}
29+
30+
public getSpanExtractors(codeInspector: CodeInspector): ISpanExtractor[] {
31+
return [];
32+
}
33+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import * as vscode from 'vscode';
2+
import * as path from 'path';
3+
import { DocumentSymbol, SymbolKind } from "vscode-languageclient";
4+
import { IMethodExtractor, SymbolInfo } from "../extractors";
5+
import { Logger } from '../../logger';
6+
7+
export class GoMethodExtractor implements IMethodExtractor{
8+
public async extractMethods(document: vscode.TextDocument, docSymbols: DocumentSymbol[]): Promise<SymbolInfo[]> {
9+
const methodSymbols = docSymbols.filter(s => s.kind+1 === SymbolKind.Method || s.kind+1 === SymbolKind.Function);
10+
if(!methodSymbols.length)
11+
return [];
12+
13+
const modFiles = await vscode.workspace.findFiles('**/go.mod');
14+
const modFile = modFiles.find(f => document.uri.path.startsWith(path.dirname(f.path)))
15+
if(!modFile){
16+
Logger.warn(`Could not resolve mod file for '${document.uri.path}'`)
17+
return [];
18+
}
19+
20+
const modFolder = path.dirname(modFile.path);
21+
const docFolder = path.dirname(document.uri.path);
22+
let packageName = '';
23+
if(modFolder === docFolder){
24+
const match = document.getText().match(/^package (.+)$/m);
25+
if(!match){
26+
Logger.warn(`Could not found packakge name in '${document.uri.path}'`)
27+
return [];
28+
}
29+
packageName = match[1];
30+
}
31+
if(!packageName || packageName !== 'main'){
32+
const modDocument = await vscode.workspace.openTextDocument(modFile);
33+
const match = modDocument.getText().match(/^module (.+)$/m);
34+
if(!match){
35+
Logger.warn(`Could not found module name in '${modFile.path}'`)
36+
return [];
37+
}
38+
packageName = match[1]
39+
40+
if(modFolder !== docFolder)
41+
packageName += '/' + path.relative(modFolder, docFolder);
42+
}
43+
44+
const methods: SymbolInfo[] = methodSymbols.map(s => {
45+
return {
46+
id: packageName + '$_$' + s.name,
47+
name: s.name,
48+
displayName: packageName.split('/').lastOrDefault() + '.' + s.name,
49+
documentUri: document.uri,
50+
codeLocation: packageName,
51+
range: new vscode.Range(
52+
new vscode.Position(s.range.start.line, s.range.start.character),
53+
new vscode.Position(s.range.end.line, s.range.end.character)
54+
)
55+
}
56+
});
57+
58+
return methods;
59+
}
60+
61+
}

src/services/languages/python/methodExtractor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { IMethodExtractor, SymbolInfo } from "../extractors";
55

66
export class PythonMethodExtractor implements IMethodExtractor
77
{
8-
public extractMethods(document: vscode.TextDocument, docSymbols: DocumentSymbol[]): SymbolInfo[] {
8+
public async extractMethods(document: vscode.TextDocument, docSymbols: DocumentSymbol[]): Promise<SymbolInfo[]> {
99
const symbolInfos = this.extractFunctions(document.uri, document.uri.toModulePath(), '', docSymbols);
1010
return symbolInfos;
1111
}

src/services/languages/symbolProvider.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -135,11 +135,12 @@ export class SymbolProvider
135135
if (symbolTrees[0].range) {
136136
// Document symbols
137137
const allDocSymbols = symbolTrees as DocumentSymbol[];
138-
const symbolInfos = supportedLanguage.methodExtractors
139-
.map(x => x.extractMethods(document, allDocSymbols))
140-
.flat();
141-
142-
return symbolInfos;
138+
const methodExtractors = supportedLanguage.methodExtractors;
139+
const extractedMethods = await Promise.all(
140+
methodExtractors.map(async (x) => await x.extractMethods(document, allDocSymbols))
141+
);
142+
const methods = extractedMethods.flat()
143+
return methods;
143144
}
144145
else {
145146
// Document symbols
@@ -160,11 +161,11 @@ export class SymbolProvider
160161
// at index `5*i+3` - `tokenType`: will be looked up in `SemanticTokensLegend.tokenTypes`. We currently ask that `tokenType` < 65536.
161162
// at index `5*i+4` - `tokenModifiers`: each set bit will be looked up in `SemanticTokensLegend.tokenModifiers`
162163

163-
const legends = await this.retryOnStartup<vscode.SemanticTokensLegend>(
164+
let legends = (await this.retryOnStartup<vscode.SemanticTokensLegend>(
164165
async () => await vscode.commands.executeCommand('vscode.provideDocumentRangeSemanticTokensLegend', document.uri),
165166
value => value?.tokenTypes ? true : false,
166167
document.languageId,
167-
);
168+
));
168169
if(!legends) {
169170
return tokes;
170171
}

src/services/languages/tokens.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ export enum TokenType {
3535
punctuation = 'punctuation',
3636
string = 'string',
3737
plainKeyword = 'plainKeyword',
38-
namespace = 'namespace'
38+
namespace = 'namespace',
39+
keyword = 'keyword'
3940
}
4041

4142
export function matchTokenSequence(tokens: Token[], matchers: TokenMatcher[]): boolean {

src/views-ui/common/common.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ ul.tree{
105105
.left-ellipsis{
106106
@extend .ellipsis;
107107
direction: rtl;
108+
unicode-bidi: plaintext;
108109
}
109110

110111
.filter-tag {

src/views/codeAnalytics/common.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,6 @@ export class HtmlHelper
3838

3939
public static getCodeObjectLabel(funcName: string): string
4040
{
41-
if (funcName.includes(".")) {
42-
let tokens = funcName.split(".");
43-
if(tokens.length > 1){
44-
funcName = `${tokens[tokens.length-2]}.${tokens[tokens.length-1]}`;
45-
}
46-
}
47-
4841
return /*html*/ `
4942
<span class="scope">Scope:</span>
5043
<span class="codicon codicon-symbol-method" title="Method"></span>

0 commit comments

Comments
 (0)