@@ -973,95 +973,77 @@ protected override Definition OnDefinition(TextDocumentPosition parameters)
973
973
Uri objUri = new Uri ( parameters . uri ) ;
974
974
if ( objUri . IsFile && this . Workspace . TryGetOpenedDocument ( objUri , out var docContext ) )
975
975
{
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 )
980
978
{
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
1008
1007
var potentialDefinitionNodes = new List < Node > ( ) ;
1009
1008
1010
- CodeElementMatcher . MatchCompletionCodeElement ( parameters . position ,
1011
- new List < CodeElementWrapper > ( ) { new CodeElementWrapper ( matchingCodeElement ) } ,
1012
- out userFilterToken , out lastSignificantToken ) ; //Magic happens here
1013
1009
if ( lastSignificantToken != null )
1014
1010
{
1015
1011
switch ( lastSignificantToken . TokenType )
1016
1012
{
1017
1013
case TokenType . PERFORM :
1018
1014
{
1019
- potentialDefinitionNodes . AddRange (
1020
- matchingNode . SymbolTable . GetParagraphs (
1021
- p => p . Name . Equals ( matchingToken . Text ,
1022
- StringComparison . OrdinalIgnoreCase ) ) ) ;
1015
+ potentialDefinitionNodes . AddRange ( matchingNode . SymbolTable . GetParagraphs ( MatchName ) ) ;
1023
1016
break ;
1024
1017
}
1025
1018
1026
1019
case TokenType . CALL :
1027
1020
{
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 ) ) ;
1032
1022
break ;
1033
1023
}
1034
1024
1035
1025
case TokenType . TYPE :
1036
1026
{
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 ) ) ;
1041
1028
break ;
1042
1029
}
1043
1030
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
1050
1032
{
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 ) ) ;
1054
1034
break ;
1055
1035
}
1056
1036
}
1037
+
1038
+ bool MatchName ( Node node ) => string . Equals ( node . Name , matchingToken . Text , StringComparison . OrdinalIgnoreCase ) ;
1057
1039
}
1058
1040
1059
1041
if ( potentialDefinitionNodes . Count > 0 )
1060
1042
{
1061
- var nodeDefinition = potentialDefinitionNodes . FirstOrDefault ( ) ;
1062
- if ( nodeDefinition != null )
1043
+ var nodeDefinition = potentialDefinitionNodes [ 0 ] ;
1044
+ if ( nodeDefinition . CodeElement != null )
1063
1045
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 ) } ) ;
1065
1047
}
1066
1048
}
1067
1049
}
0 commit comments