8
8
Range ,
9
9
TextDocument ,
10
10
InlineValueVariableLookup ,
11
+ InlineValueEvaluatableExpression ,
11
12
} from 'vscode' ;
12
13
import { customRequest } from '../../common/vscodeapi' ;
13
14
@@ -59,14 +60,19 @@ export class PythonInlineValueProvider implements InlineValuesProvider {
59
60
'if' ,
60
61
'or' ,
61
62
'yield' ,
63
+ 'self' ,
62
64
] ;
63
65
64
66
const pythonVariables : any [ ] = variablesRequest . variables
65
67
. filter ( ( variable : any ) => variable . type )
66
68
. map ( ( variable : any ) => variable . name ) ;
67
69
68
- //VariableRegex for matching variables names in a python file, excluding strings
69
- let variableRegex = / (?< ! [ ' " \w ] ) \b [ a - z A - Z _ ] [ a - z A - Z 0 - 9 _ ] * \b (? ! [ ^ " \n ] * " (?: (?: [ ^ " \n ] * " ) { 2 } ) * [ ^ " \n ] * $ ) / g;
70
+ let variableRegex = new RegExp (
71
+ '(?:self.)?' + //match self. if present
72
+ '[a-zA-Z_][a-zA-Z0-9_]*' , //math variable name
73
+ 'g' ,
74
+ ) ;
75
+
70
76
const allValues : InlineValue [ ] = [ ] ;
71
77
for ( let l = viewPort . start . line ; l <= viewPort . end . line ; l ++ ) {
72
78
const line = document . lineAt ( l ) ;
@@ -75,18 +81,47 @@ export class PythonInlineValueProvider implements InlineValuesProvider {
75
81
continue ;
76
82
}
77
83
78
- for ( let match = variableRegex . exec ( line . text ) ; match ; match = variableRegex . exec ( line . text ) ) {
84
+ let code = removeCharsOutsideBraces ( line . text ) ;
85
+
86
+ for ( let match = variableRegex . exec ( code ) ; match ; match = variableRegex . exec ( code ) ) {
79
87
let varName = match [ 0 ] ;
80
88
// Skip python keywords
81
89
if ( pythonKeywords . includes ( varName ) ) {
82
90
continue ;
83
91
}
84
- if ( pythonVariables . includes ( varName ) ) {
85
- const rng = new Range ( l , match . index , l , match . index + varName . length ) ;
86
- allValues . push ( new InlineValueVariableLookup ( rng , varName , false ) ) ;
92
+ if ( pythonVariables . includes ( varName . split ( '.' ) [ 0 ] ) ) {
93
+ if ( varName . includes ( 'self' ) ) {
94
+ const rng = new Range ( l , match . index , l , match . index + varName . length ) ;
95
+ allValues . push ( new InlineValueEvaluatableExpression ( rng , varName ) ) ;
96
+ } else {
97
+ const rng = new Range ( l , match . index , l , match . index + varName . length ) ;
98
+ allValues . push ( new InlineValueVariableLookup ( rng , varName , false ) ) ;
99
+ }
87
100
}
88
101
}
89
102
}
90
103
return allValues ;
91
104
}
92
105
}
106
+
107
+ function removeCharsOutsideBraces ( code : string ) : string {
108
+ // Regular expression to find Python strings
109
+ const stringRegex = / ( [ " ' ] ) (?: (? = ( \\ ? ) ) \2.) * ?\1/ g;
110
+
111
+ //Regular expression to match values inside {}
112
+ const insideBracesRegex = / { [ ^ { } ] * } / g;
113
+
114
+ return code . replace ( stringRegex , ( match ) => {
115
+ const content = match . slice ( 1 , - 1 ) ;
116
+
117
+ let result = '' ;
118
+ let tempMatch ;
119
+
120
+ while ( ( tempMatch = insideBracesRegex . exec ( content ) ) !== null ) {
121
+ result += tempMatch [ 0 ] ;
122
+ }
123
+ const processedContent = result || content ;
124
+
125
+ return match [ 0 ] + processedContent + match [ 0 ] ;
126
+ } ) ;
127
+ }
0 commit comments