Skip to content

Commit 140a691

Browse files
Distinguish between targets and variables in the symbol listing.
1 parent aa2b989 commit 140a691

File tree

6 files changed

+104
-72
lines changed

6 files changed

+104
-72
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# v0.2.2
2+
3+
* Distinguish between targets and variables in the symbol listing.
4+
15
# v0.2.1
26

37
* Fix bug where document symbols are not available for documents already open at launch.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "fastbuild-support",
33
"displayName": "FASTBuild Support",
44
"description": "FASTBuild language support. Includes go-to definition, find references, variable evaluation, syntax errors, etc.",
5-
"version": "0.2.1",
5+
"version": "0.2.2",
66
"preview": true,
77
"publisher": "HarrisonT",
88
"author": {

server/src/evaluator.ts

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,16 @@ export interface EvaluatedVariable {
107107
range: SourceRange;
108108
}
109109

110+
export enum DefinitionKind {
111+
Target,
112+
Variable,
113+
}
114+
110115
export interface VariableDefinition {
111116
id: number;
112117
range: SourceRange;
113118
name: string;
119+
kind: DefinitionKind;
114120
}
115121

116122
export interface VariableReference {
@@ -769,13 +775,14 @@ class ScopeStack {
769775
return this.stack[this.stack.length - 1];
770776
}
771777

772-
createVariableDefinition(range: SourceRange, name: string): VariableDefinition {
778+
createVariableDefinition(range: SourceRange, name: string, kind: DefinitionKind): VariableDefinition {
773779
const id = this.nextVariableDefinitionId;
774780
this.nextVariableDefinitionId += 1;
775781
return {
776782
id,
777783
range,
778784
name,
785+
kind,
779786
};
780787
}
781788
}
@@ -810,26 +817,30 @@ interface EvaluationContext {
810817
function createDefaultScopeStack(rootFbuildDirUri: vscodeUri.URI): ScopeStack {
811818
const scopeStack = new ScopeStack();
812819

813-
const dummyVariableDefinition: VariableDefinition = {
814-
id: -1,
815-
range: {
816-
uri: '',
817-
start: {
818-
line: -1,
819-
character: -1
820+
const createNoLocationVariableDefinition = (name: string) => {
821+
const definition: VariableDefinition = {
822+
id: -1,
823+
range: {
824+
uri: '',
825+
start: {
826+
line: -1,
827+
character: -1
828+
},
829+
end: {
830+
line: -1,
831+
character: -1
832+
}
820833
},
821-
end: {
822-
line: -1,
823-
character: -1
824-
}
825-
},
826-
name: '',
834+
name,
835+
kind: DefinitionKind.Variable,
836+
};
837+
return definition;
827838
};
828839

829-
scopeStack.setVariableInCurrentScope('_WORKING_DIR_', rootFbuildDirUri.fsPath, dummyVariableDefinition);
830-
scopeStack.setVariableInCurrentScope('_CURRENT_BFF_DIR_', '', dummyVariableDefinition);
831-
scopeStack.setVariableInCurrentScope('_FASTBUILD_VERSION_STRING_', 'vPlaceholderFastBuildVersionString', dummyVariableDefinition);
832-
scopeStack.setVariableInCurrentScope('_FASTBUILD_VERSION_', -1, dummyVariableDefinition);
840+
scopeStack.setVariableInCurrentScope('_WORKING_DIR_', rootFbuildDirUri.fsPath, createNoLocationVariableDefinition('_WORKING_DIR_'));
841+
scopeStack.setVariableInCurrentScope('_CURRENT_BFF_DIR_', '', createNoLocationVariableDefinition('_CURRENT_BFF_DIR_'));
842+
scopeStack.setVariableInCurrentScope('_FASTBUILD_VERSION_STRING_', 'vPlaceholderFastBuildVersionString', createNoLocationVariableDefinition('_FASTBUILD_VERSION_STRING_'));
843+
scopeStack.setVariableInCurrentScope('_FASTBUILD_VERSION_', -1, createNoLocationVariableDefinition('_FASTBUILD_VERSION_'));
833844

834845
return scopeStack;
835846
}
@@ -897,7 +908,7 @@ function evaluateStatements(statements: Statement[], context: EvaluationContext)
897908
existingValue = existingVariable.value;
898909
}
899910

900-
const definition = context.scopeStack.createVariableDefinition(lhsRange, evaluatedLhsName.value);
911+
const definition = context.scopeStack.createVariableDefinition(lhsRange, evaluatedLhsName.value, DefinitionKind.Variable);
901912
variable = context.scopeStack.setVariableInCurrentScope(evaluatedLhsName.value, value, definition);
902913

903914
if (existingVariable === null) {
@@ -969,7 +980,7 @@ function evaluateStatements(statements: Statement[], context: EvaluationContext)
969980
&& (maybeExistingVariableStartingFromParentScope = context.scopeStack.getVariableStartingFromCurrentScope(evaluatedLhsName.value)) !== null)
970981
{
971982
previousValue = maybeExistingVariableStartingFromParentScope.value;
972-
const definition = context.scopeStack.createVariableDefinition(lhsRange, evaluatedLhsName.value);
983+
const definition = context.scopeStack.createVariableDefinition(lhsRange, evaluatedLhsName.value, DefinitionKind.Variable);
973984
result.variableDefinitions.push(definition);
974985
lhsVariable = context.scopeStack.setVariableInCurrentScope(evaluatedLhsName.value, previousValue, definition);
975986
} else {
@@ -1101,7 +1112,7 @@ function evaluateStatements(statements: Statement[], context: EvaluationContext)
11011112
existingVariable.value = structMember.value;
11021113
variableDefinition = existingVariable.definition;
11031114
} else {
1104-
variableDefinition = context.scopeStack.createVariableDefinition(statementRange, structMemberName);
1115+
variableDefinition = context.scopeStack.createVariableDefinition(statementRange, structMemberName, DefinitionKind.Variable);
11051116
context.scopeStack.setVariableInCurrentScope(structMemberName, structMember.value, variableDefinition);
11061117
result.variableDefinitions.push(variableDefinition);
11071118
}
@@ -1173,7 +1184,7 @@ function evaluateStatements(statements: Statement[], context: EvaluationContext)
11731184
}
11741185
const evaluatedLoopVarNameValue: string = evaluatedLoopVarName.value;
11751186

1176-
const loopVarDefinition = context.scopeStack.createVariableDefinition(loopVarRange, evaluatedLoopVarNameValue);
1187+
const loopVarDefinition = context.scopeStack.createVariableDefinition(loopVarRange, evaluatedLoopVarNameValue, DefinitionKind.Variable);
11771188

11781189
iterators.push({
11791190
arrayItems,
@@ -1231,7 +1242,7 @@ function evaluateStatements(statements: Statement[], context: EvaluationContext)
12311242
}
12321243

12331244
// Create a definition and reference for the target name.
1234-
const targetNameDefinition = context.scopeStack.createVariableDefinition(evaluatedTargetNameRange, evaluatedTargetName.value);
1245+
const targetNameDefinition = context.scopeStack.createVariableDefinition(evaluatedTargetNameRange, evaluatedTargetName.value, DefinitionKind.Target);
12351246
const targetNameReference: VariableReference = {
12361247
definition: targetNameDefinition,
12371248
range: evaluatedTargetNameRange,
@@ -1442,7 +1453,7 @@ function evaluateStatements(statements: Statement[], context: EvaluationContext)
14421453
const symbol = statement.symbol.value;
14431454
const value = `placeholder-${symbol}-value`;
14441455
const statementRange = new SourceRange(context.thisFbuildUri, statement.range);
1445-
const definition = context.scopeStack.createVariableDefinition(statementRange, symbol);
1456+
const definition = context.scopeStack.createVariableDefinition(statementRange, symbol, DefinitionKind.Variable);
14461457
context.scopeStack.setVariableInCurrentScope(symbol, value, definition);
14471458
} else {
14481459
const dummyRange = SourceRange.create(context.thisFbuildUri, 0, 0, 0, 0);
@@ -1627,6 +1638,7 @@ function evaluateEvaluatedVariable(parsedEvaluatedVariable: ParsedEvaluatedVaria
16271638
id: 0,
16281639
range: SourceRange.create('', 0, 0, 0, 0),
16291640
name: '',
1641+
kind: DefinitionKind.Variable,
16301642
},
16311643
};
16321644

@@ -2129,7 +2141,7 @@ function evaluateUserFunctionDeclaration(
21292141
context: EvaluationContext
21302142
): DataAndMaybeError<EvaluatedData> {
21312143
const nameSourceRange = new SourceRange(context.thisFbuildUri, userFunction.nameRange);
2132-
const functionNameDefinition = context.scopeStack.createVariableDefinition(nameSourceRange, userFunction.name);
2144+
const functionNameDefinition = context.scopeStack.createVariableDefinition(nameSourceRange, userFunction.name, DefinitionKind.Variable);
21332145
const functionNameReference = {
21342146
definition: functionNameDefinition,
21352147
range: nameSourceRange,
@@ -2167,7 +2179,7 @@ function evaluateUserFunctionDeclaration(
21672179
}
21682180
usedParameterNames.push(parameter.name);
21692181

2170-
const definition = context.scopeStack.createVariableDefinition(paramSourceRange, parameter.name);
2182+
const definition = context.scopeStack.createVariableDefinition(paramSourceRange, parameter.name, DefinitionKind.Variable);
21712183
parameter.definition = definition;
21722184

21732185
result.variableDefinitions.push(definition);

server/src/features/referenceProvider.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
} from '../parser';
1818

1919
import {
20+
DefinitionKind,
2021
EvaluatedData,
2122
} from '../evaluator';
2223

@@ -71,7 +72,7 @@ export class ReferenceProvider {
7172

7273
const symbol: DocumentSymbol = {
7374
name: variableDefinition.name,
74-
kind: SymbolKind.Variable,
75+
kind: variableDefinition.kind == DefinitionKind.Target ? SymbolKind.Function : SymbolKind.Variable,
7576
range: variableDefinition.range,
7677
selectionRange: variableDefinition.range,
7778
};
@@ -90,7 +91,7 @@ export class ReferenceProvider {
9091

9192
const symbol: SymbolInformation = {
9293
name: variableDefinition.name,
93-
kind: SymbolKind.Variable,
94+
kind: variableDefinition.kind == DefinitionKind.Target ? SymbolKind.Function : SymbolKind.Variable,
9495
location: {
9596
uri: variableDefinition.range.uri,
9697
range: variableDefinition.range,

0 commit comments

Comments
 (0)