Skip to content

Commit f86b5f1

Browse files
authored
WI #2432 Refactor method TypeCobolServer.OnDefinition (#2437)
1 parent 6321198 commit f86b5f1

File tree

1 file changed

+40
-58
lines changed

1 file changed

+40
-58
lines changed

TypeCobol.LanguageServer/TypeCobolServer.cs

Lines changed: 40 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -973,95 +973,77 @@ protected override Definition OnDefinition(TextDocumentPosition parameters)
973973
Uri objUri = new Uri(parameters.uri);
974974
if (objUri.IsFile && this.Workspace.TryGetOpenedDocument(objUri, out var docContext))
975975
{
976-
System.Diagnostics.Debug.Assert(docContext.FileCompiler != null);
977-
978-
if (docContext.FileCompiler.CompilationResultsForProgram != null &&
979-
docContext.FileCompiler.CompilationResultsForProgram.ProcessedTokensDocumentSnapshot != null)
976+
var codeElementToNode = docContext.FileCompiler?.CompilationResultsForProgram.ProgramClassDocumentSnapshot?.NodeCodeElementLinkers;
977+
if (codeElementToNode != null)
980978
{
981-
var matchingCodeElement =
982-
docContext.FileCompiler.CompilationResultsForProgram.ProgramClassDocumentSnapshot
983-
.NodeCodeElementLinkers
984-
.Keys.FirstOrDefault(c => c.ConsumedTokens.Any(
985-
t => t.Line == parameters.position.line + 1 &&
986-
parameters.position.character >= t.StartIndex &&
987-
parameters.position.character <= t.StopIndex + 1) &&
988-
!c.IsInsideCopy());
989-
if (matchingCodeElement == null)
990-
return defaultDefinition;
991-
992-
var matchingNode =
993-
docContext.FileCompiler.CompilationResultsForProgram.ProgramClassDocumentSnapshot
994-
.NodeCodeElementLinkers[matchingCodeElement];
995-
if (matchingNode == null)
996-
return defaultDefinition;
997-
998-
var matchingToken = matchingCodeElement.ConsumedTokens.FirstOrDefault(t =>
999-
t.Line == parameters.position.line + 1 &&
1000-
parameters.position.character >= t.StartIndex &&
1001-
parameters.position.character <= t.StopIndex + 1 &&
1002-
t.TokenType != TokenType.QualifiedNameSeparator);
1003-
if (matchingToken == null)
1004-
return defaultDefinition;
1005-
1006-
Token userFilterToken = null;
1007-
Token lastSignificantToken = null;
979+
Token matchingToken = null;
980+
var matchingCodeElement = codeElementToNode.Keys.FirstOrDefault(MatchPosition);
981+
if (matchingCodeElement == null) return defaultDefinition;
982+
983+
var matchingNode = codeElementToNode[matchingCodeElement];
984+
if (matchingNode == null) return defaultDefinition;
985+
986+
bool MatchPosition(CodeElement codeElement)
987+
{
988+
foreach (var token in codeElement.ConsumedTokens)
989+
{
990+
if (token.Line == parameters.position.line + 1 &&
991+
parameters.position.character >= token.StartIndex &&
992+
parameters.position.character <= token.StopIndex + 1 &&
993+
token.TokenType != TokenType.QualifiedNameSeparator)
994+
{
995+
matchingToken = token;
996+
return !codeElement.IsInsideCopy();
997+
}
998+
}
999+
1000+
return false;
1001+
}
1002+
1003+
CodeElementMatcher.MatchCompletionCodeElement(parameters.position, new List<CodeElementWrapper>()
1004+
{
1005+
new CodeElementWrapper(matchingCodeElement)
1006+
}, out _, out var lastSignificantToken); //Magic happens here
10081007
var potentialDefinitionNodes = new List<Node>();
10091008

1010-
CodeElementMatcher.MatchCompletionCodeElement(parameters.position,
1011-
new List<CodeElementWrapper>() {new CodeElementWrapper(matchingCodeElement)},
1012-
out userFilterToken, out lastSignificantToken); //Magic happens here
10131009
if (lastSignificantToken != null)
10141010
{
10151011
switch (lastSignificantToken.TokenType)
10161012
{
10171013
case TokenType.PERFORM:
10181014
{
1019-
potentialDefinitionNodes.AddRange(
1020-
matchingNode.SymbolTable.GetParagraphs(
1021-
p => p.Name.Equals(matchingToken.Text,
1022-
StringComparison.OrdinalIgnoreCase)));
1015+
potentialDefinitionNodes.AddRange(matchingNode.SymbolTable.GetParagraphs(MatchName));
10231016
break;
10241017
}
10251018

10261019
case TokenType.CALL:
10271020
{
1028-
potentialDefinitionNodes.AddRange(matchingNode.SymbolTable.GetFunctions(
1029-
f => f.Name.Equals(matchingToken.Text, StringComparison.OrdinalIgnoreCase),
1030-
SymbolTable.Scope.Program
1031-
));
1021+
potentialDefinitionNodes.AddRange(matchingNode.SymbolTable.GetFunctions(MatchName, SymbolTable.Scope.Program));
10321022
break;
10331023
}
10341024

10351025
case TokenType.TYPE:
10361026
{
1037-
potentialDefinitionNodes.AddRange(matchingNode.SymbolTable.GetTypes(
1038-
t => t.Name.Equals(matchingToken.Text, StringComparison.OrdinalIgnoreCase),
1039-
SymbolTable.Scope.Program
1040-
));
1027+
potentialDefinitionNodes.AddRange(matchingNode.SymbolTable.GetTypes(MatchName, SymbolTable.Scope.Program));
10411028
break;
10421029
}
10431030

1044-
case TokenType.INPUT:
1045-
case TokenType.OUTPUT:
1046-
case TokenType.IN_OUT:
1047-
case TokenType.MOVE:
1048-
case TokenType.TO:
1049-
default:
1031+
default: //INPUT, OUTPUT, IN_OUT, MOVE, TO, etc
10501032
{
1051-
potentialDefinitionNodes.AddRange(matchingNode.SymbolTable.GetVariables(
1052-
v => v.Name.Equals(matchingToken.Text, StringComparison.OrdinalIgnoreCase),
1053-
SymbolTable.Scope.Program));
1033+
potentialDefinitionNodes.AddRange(matchingNode.SymbolTable.GetVariables(MatchName, SymbolTable.Scope.Program));
10541034
break;
10551035
}
10561036
}
1037+
1038+
bool MatchName(Node node) => string.Equals(node.Name, matchingToken.Text, StringComparison.OrdinalIgnoreCase);
10571039
}
10581040

10591041
if (potentialDefinitionNodes.Count > 0)
10601042
{
1061-
var nodeDefinition = potentialDefinitionNodes.FirstOrDefault();
1062-
if (nodeDefinition != null)
1043+
var nodeDefinition = potentialDefinitionNodes[0];
1044+
if (nodeDefinition.CodeElement != null)
10631045
return new Definition(parameters.uri,
1064-
new Range() {start = new Position(nodeDefinition.CodeElement.Line - 1, 0)});
1046+
new Range() { start = new Position(nodeDefinition.CodeElement.Line - 1, 0) });
10651047
}
10661048
}
10671049
}

0 commit comments

Comments
 (0)