Skip to content

Commit f02421f

Browse files
authored
Feature/duration breakdown insight changes (#205)
* duration breakdown support * aliases refactoring
1 parent 2165534 commit f02421f

File tree

20 files changed

+302
-154
lines changed

20 files changed

+302
-154
lines changed

package-lock.json

Lines changed: 17 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@
143143
"@types/jquery": "^3.5.14",
144144
"@vscode/codicons": "0.0.20",
145145
"@vscode/webview-ui-toolkit": "^0.8.5",
146+
"entities": "^4.4.0",
146147
"https": "^1.0.0",
147148
"moment": "^2.29.3",
148149
"node-fetch": "^2.6.6",

src/analyticsCodeLens.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ class CodelensProvider implements vscode.CodeLensProvider<vscode.CodeLens>
185185
const codelens: vscode.CodeLens[] = [];
186186
for(let methodInfo of documentInfo.methods)
187187
{
188-
for (let alias of methodInfo.aliases){
188+
for (let alias of methodInfo.ids){
189189
const insights = documentInfo.insights.all.filter(x=>x.codeObjectId== alias)
190190
.filter(x=>x.scope=="Function");
191191

@@ -235,7 +235,7 @@ class CodelensProvider implements vscode.CodeLensProvider<vscode.CodeLens>
235235

236236
}
237237

238-
for (let alias of methodInfo.aliases){
238+
for (let alias of methodInfo.ids){
239239
const insights = documentInfo.insights.all.filter(x=>x.codeObjectId== alias)
240240
.filter(x=>x.scope=="Function");
241241

src/services/codeObject.ts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,21 +75,11 @@ export class MinimalCodeObjectInfo implements CodeObjectInfo {
7575

7676
export interface ICodeObjectIdParser {
7777
parse(codeObjectId: string): CodeObjectInfo;
78-
generateAliases(codeObjectId: string): string[];
7978
}
8079

8180
export class CommonCodeObjectIdParser implements ICodeObjectIdParser {
8281
parse(codeObjectId: string): CodeObjectInfo {
8382
const [path, method] = codeObjectId.split(CodeObjectId.codeObjectSeparator);
8483
return new MinimalCodeObjectInfo(codeObjectId, method);
8584
}
86-
87-
generateAliases(codeObjectId: string): string[] {
88-
const folders = codeObjectId.split('/');
89-
const aliases = [codeObjectId];
90-
for (let i = 1; i < folders.length; i++) {
91-
aliases.push(folders.slice(i, folders.length).join('/'));
92-
}
93-
return aliases;
94-
}
9585
}

src/services/documentInfoProvider.ts

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { Logger } from "./logger";
55
import { SymbolProvider } from './languages/symbolProvider';
66
import { Token, TokenType } from './languages/tokens';
77
import { Dictionary, Future } from './utils';
8-
import { EndpointInfo, SpanLocationInfo as SpanLocationInfo, SymbolInfo, IParametersExtractor, CodeObjectLocationInfo } from './languages/extractors';
8+
import { EndpointInfo, SpanLocationInfo as SpanLocationInfo, SymbolInfo, IParametersExtractor, CodeObjectLocationInfo, ISymbolAliasExtractor } from './languages/extractors';
99
import { InstrumentationInfo } from './EditorHelper';
1010
import { SymbolInformation } from 'vscode';
1111
import { WorkspaceState } from '../state';
@@ -186,7 +186,9 @@ export class DocumentInfoProvider implements vscode.Disposable
186186
const endpoints = await this.symbolProvider.getEndpoints(doc, symbolInfos, tokens, symbolTrees, this);
187187
const spans = await this.symbolProvider.getSpans(doc, symbolInfos, tokens);
188188
const paramsExtractor = await this.symbolProvider.getParametersExtractor(doc);
189-
let methodInfos = await this.createMethodInfos(doc, paramsExtractor, symbolInfos, tokens, spans, endpoints);
189+
const symbolAliasExtractor = await this.symbolProvider.getSymbolAliasExtractor(doc);
190+
191+
let methodInfos = await this.createMethodInfos(doc, paramsExtractor, symbolAliasExtractor, symbolInfos, tokens, spans, endpoints);
190192

191193
let codeObjectIds = methodInfos.flatMap(s => s.idsWithType)
192194
.concat(endpoints.flatMap(e => e.idsWithType))
@@ -230,7 +232,7 @@ export class DocumentInfoProvider implements vscode.Disposable
230232
// These are spans that the server is aware of but the client can't discover
231233
const spansDiscoveredViaServer = insightsResult
232234
.filter(x=>x.scope=="Span")
233-
.filter(x=>!spans.any(e=>e.id===x.codeObjectId));
235+
.filter(x=>!spans.any(e=>e.id===x.codeObjectId)); //why we assume the the codeobjectid is span codeobject id, the output is that these span are spans discovered by server
234236

235237
const uniqueSpans = [...new Map(spansDiscoveredViaServer.map(item =>
236238
[item.codeObjectId, item])).values()];
@@ -253,7 +255,7 @@ export class DocumentInfoProvider implements vscode.Disposable
253255
}
254256
}
255257

256-
const newMethodInfos = await this.createMethodInfos(doc, paramsExtractor, symbolInfos, tokens, spans, endpoints);
258+
const newMethodInfos = await this.createMethodInfos(doc, paramsExtractor, symbolAliasExtractor, symbolInfos, tokens, spans, endpoints);
257259
methodInfos=newMethodInfos;
258260
const insights = new CodeObjectInsightsAccessor(insightsResult);
259261
//const lines:LineInfo[] = [];
@@ -306,20 +308,15 @@ export class DocumentInfoProvider implements vscode.Disposable
306308
private async createMethodInfos(
307309
document: vscode.TextDocument,
308310
parametersExtractor: IParametersExtractor,
311+
symbolAliasExtractor: ISymbolAliasExtractor,
309312
symbols: SymbolInfo[],
310313
tokens: Token[],
311314
spans: SpanLocationInfo[],
312315
endpoints: EndpointInfo[],
313316
): Promise<MethodInfo[]> {
314-
const codeObjectIdParser = await this.symbolProvider.getCodeObjectIdParser(document);
315-
if(!codeObjectIdParser) {
316-
return [];
317-
}
318-
319317
let methods: MethodInfo[] = [];
320-
321318
for(let symbol of symbols) {
322-
const aliases = codeObjectIdParser.generateAliases(symbol.id);
319+
const aliases = symbolAliasExtractor.extractAliases(symbol);
323320
const method = new MethodInfo(
324321
symbol.id,
325322
symbol.name,
@@ -379,7 +376,7 @@ export class DocumentInfoProvider implements vscode.Disposable
379376
const lineInfosByEnv: ElementsByEnv<LineInfo> = new ElementsByEnv<LineInfo>(state);
380377
for(let method of methods)
381378
{
382-
const codeObjectSummary = methodSummaries.find(x=>method.aliases.any(a=>a ==x.codeObjectId));
379+
const codeObjectSummary = methodSummaries.find(x=>method.ids.any(a=>a ==x.codeObjectId));
383380
if(!codeObjectSummary)
384381
continue;
385382

@@ -579,12 +576,10 @@ export class CodeObjectInsightsAccessor{
579576

580577

581578
public forMethod(methodInfo: MethodInfo, environment: string|undefined){
582-
const codeObjectsIds = methodInfo.aliases
583-
.concat(methodInfo.relatedCodeObjects.flatMap(r => r.ids));
584-
579+
const codeObjectsIds = methodInfo.getIds(true,false);
585580
let insights = this._codeObjectInsights.filter(x=>codeObjectsIds.any(o=> o==x.codeObjectId));
586581
if (environment){
587-
insights = insights.filter(x=>x.environment==environment);
582+
insights = insights.filter(x=>x.environment===environment);
588583
}
589584
return insights;
590585

@@ -616,7 +611,7 @@ export class MethodInfo implements CodeObjectLocationInfo
616611
public range: vscode.Range,
617612
public parameters: ParameterInfo[],
618613
public symbol: SymbolInfo,
619-
public aliases: string[],
614+
private aliases: string[],
620615
public relatedCodeObjects: CodeObjectLocationInfo[],
621616
public documentUri: vscode.Uri){}
622617

@@ -635,7 +630,18 @@ export class MethodInfo implements CodeObjectLocationInfo
635630
];
636631
}
637632

638-
633+
public getIds(includeRelated: boolean = false, withType: boolean = false): string[] {
634+
if(includeRelated) {
635+
if(withType){
636+
return [...new Set(this.idsWithType .concat(this.relatedCodeObjects.flatMap(r => r.idsWithType)))];
637+
}
638+
return [...new Set(this.ids .concat(this.relatedCodeObjects.flatMap(r => r.ids)))];
639+
}
640+
if(withType){
641+
return this.idsWithType;
642+
}
643+
return this.ids;
644+
}
639645
}
640646

641647
export interface ParameterInfo

src/services/languages/extractors.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,18 @@ export interface IMethodExtractor {
7474
tokens: Token [],
7575
): Promise<SymbolInfo[]>;
7676
}
77+
export interface ISymbolAliasExtractor {
78+
extractAliases(
79+
symbol: SymbolInfo): string[];
80+
}
81+
export class EmptySymbolAliasExtractor implements ISymbolAliasExtractor {
82+
extractAliases(symbol: SymbolInfo): string[] {
83+
return [];
84+
}
85+
86+
}
87+
88+
7789

7890
export interface IParametersExtractor {
7991
extractParameters(methodName: string, methodTokens: Token[]): Promise<ParameterInfo[]>;

src/services/languages/javascript/codeObjectIdParser.ts

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,4 @@ export class JSCodeObjectIdParser implements ICodeObjectIdParser {
3434
symbol,
3535
);
3636
}
37-
38-
generateAliases(codeObjectId: string): string[] {
39-
const objectPrefix = 'Object.';
40-
const info: JSCodeObjectInfo = this.parse(codeObjectId);
41-
const prefixedAliased = info.symbol.startsWith(objectPrefix)
42-
? info.symbol.substring(objectPrefix.length)
43-
: `${objectPrefix}${info.symbol}`;
44-
return [
45-
codeObjectId,
46-
`${info.packageName}:${info.modulePath}${CodeObjectId.codeObjectSeparator}${prefixedAliased}`,
47-
];
48-
}
4937
}

src/services/languages/languageExtractor.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as vscode from 'vscode';
22
import { CodeInspector } from '../codeInspector';
33
import { IMethodPositionSelector, DefaultMethodPositionSelector } from './methodPositionSelector';
4-
import { IMethodExtractor, IParametersExtractor, IEndpointExtractor, ISpanExtractor } from './extractors';
4+
import { IMethodExtractor, IParametersExtractor, IEndpointExtractor, ISpanExtractor, ISymbolAliasExtractor, EmptySymbolAliasExtractor } from './extractors';
55
import { BasicParametersExtractor } from './defaultImpls';
66
import { IModulePathToUriConverter } from './modulePathToUriConverters';
77
import { ICodeObjectIdParser, CommonCodeObjectIdParser } from '../codeObject';
@@ -16,11 +16,13 @@ export interface ILanguageExtractor {
1616
getEndpointExtractors(codeInspector: CodeInspector): IEndpointExtractor[];
1717
getSpanExtractors(codeInspector: CodeInspector): ISpanExtractor[];
1818
validateConfiguration(): Promise<void>;
19+
get symbolAliasExtractor(): ISymbolAliasExtractor;
1920
getModulePathToUriConverters(): Promise<IModulePathToUriConverter[]>;
2021
getCodeObjectIdParser(): ICodeObjectIdParser;
2122
}
2223

2324
export abstract class LanguageExtractor implements ILanguageExtractor {
25+
2426
public abstract requiredExtensionLoaded: boolean;
2527

2628
public abstract get requiredExtensionId(): string;
@@ -29,6 +31,10 @@ export abstract class LanguageExtractor implements ILanguageExtractor {
2931

3032
public abstract get methodExtractors(): IMethodExtractor[];
3133

34+
public get symbolAliasExtractor(): ISymbolAliasExtractor {
35+
return new EmptySymbolAliasExtractor();
36+
}
37+
3238
public get parametersExtractor(): IParametersExtractor {
3339
return new BasicParametersExtractor();
3440
}

src/services/languages/python/languageExtractor.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import * as vscode from 'vscode';
22
import { CodeInspector } from '../../codeInspector';
3-
import { IMethodExtractor, ISpanExtractor } from '../extractors';
3+
import { IMethodExtractor, ISpanExtractor, ISymbolAliasExtractor } from '../extractors';
44
import { LanguageExtractor } from '../languageExtractor';
55
import { IModulePathToUriConverter, PhysicalModulePathToUriConverter } from '../modulePathToUriConverters';
66
import { PythonMethodExtractor } from './methodExtractor';
77
import { PythonSpanExtractor } from './spanExtractor';
8+
import { PythonSymbolAliasExtractor } from './symbolAliasExtractor';
89

910
export class PythonLanguageExtractor extends LanguageExtractor {
1011
public requiredExtensionLoaded: boolean = false;
@@ -29,6 +30,10 @@ export class PythonLanguageExtractor extends LanguageExtractor {
2930
];
3031
}
3132

33+
public get symbolAliasExtractor(): ISymbolAliasExtractor {
34+
return new PythonSymbolAliasExtractor();
35+
}
36+
3237
public async getModulePathToUriConverters(): Promise<IModulePathToUriConverter[]> {
3338
return [
3439
new PhysicalModulePathToUriConverter(),
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { ISymbolAliasExtractor, SymbolInfo } from "../extractors";
2+
3+
export class PythonSymbolAliasExtractor implements ISymbolAliasExtractor{
4+
public extractAliases(symbol: SymbolInfo): string[] {
5+
var folders = symbol.id.split("/");
6+
let aliases = [];
7+
//aliases.push(symbol.id);
8+
for (let i=1;i<folders.length;i++){
9+
aliases.push(folders.slice(i, folders.length).join("/"));
10+
}
11+
return aliases;
12+
}
13+
}

0 commit comments

Comments
 (0)