@@ -31,6 +31,7 @@ extend framework::Rename;
3131import lang ::rascal ::\syntax ::Rascal ;
3232
3333import analysis ::typepal ::TModel ;
34+ import analysis ::diff ::edits ::TextEdits ;
3435import lang ::rascal ::lsp ::refactor ::Rename ;
3536import lang ::rascal ::lsp ::refactor ::rename ::Common ;
3637import lang ::rascalcore ::check ::BasicRascalConfig ;
@@ -120,20 +121,36 @@ private bool isReachable(PathConfig toProject, PathConfig fromProject) =
120121 toProject == fromProject // Both configs belong to the same project
121122 || toProject.bin in fromProject.libs; // The using project can import the declaring project
122123
123- list[TextEdit] getChanges (loc f, PathConfig wsProject, rel [str oldName, str newName, PathConfig pcfg] qualifiedNameChanges) {
124- list[TextEdit] changes = [] ;
125-
126- start[Module] m = parseModuleWithSpaces(f);
127- for (/ QualifiedName qn := m ) {
128- for (< oldName , l > <- { fullQualifiedName ( qn ), qualifiedPrefix ( qn )}
129- , {< newName , projWithRenamedMod >} := qualifiedNameChanges [ oldName ]
130- , isReachable ( projWithRenamedMod , wsProject )
131- ) {
132- changes += replace ( l , newName );
133- }
124+ list[TextEdit] getChangesByContents (loc f, PathConfig wsProject, lrel [str oldName, str newName, PathConfig pcfg] qualifiedNameChanges, void(Message) registerMessage ) {
125+ str contents = readFile(f) ;
126+ changesInFile = [ < oldName , newName >
127+ | < oldName , newName , projWithRenamedMod > <- qualifiedNameChanges
128+ , contains ( contents , oldName ) && isReachable ( projWithRenamedMod , wsProject )
129+ ];
130+
131+ if ( changesInFile != []) {
132+ enum = " \n - " ;
133+ changeList = enum + intercalate ( enum , [ "` < oldName > ` - \> ` < newName > `" | < oldName , newName > <- changesInFile ] );
134+ registerMessage ( warning ( "File contains reference(s) to renamed module(s), but it has a parse error and cannot be modified. Please modify this file manually. < changeList > " , f ));
134135 }
136+ return [];
137+ }
135138
136- return changes ;
139+ list [TextEdit ] getChanges (loc f , PathConfig wsProject , lrel [str oldName , str newName , PathConfig pcfg ] qualifiedNameChanges , void (Message ) registerMessage ) {
140+ try {
141+ start [Module ] m = parseModuleWithSpaces (f );
142+ return [replace (l , newName )
143+ | /QualifiedName qn := m
144+ , <oldName , l > <- {fullQualifiedName (qn ), qualifiedPrefix (qn )}
145+ , [<newName , projWithRenamedMod > ] := qualifiedNameChanges[oldName]
146+ , isReachable(projWithRenamedMod, wsProject)
147+ ];
148+ }
149+ catch Java("ParseError", str msg): return getChangesByContents(f, wsProject, qualifiedNameChanges, registerMessage);
150+ catch JavaException("ParseError", str msg): return getChangesByContents(f, wsProject, qualifiedNameChanges, registerMessage);
151+ // Catch all
152+ catch e: registerMessage(error("<e > ", f));
153+ return [];
137154}
138155
139156set[tuple[str, str, PathConfig]] getQualifiedNameChanges(loc old, loc new, PathConfig(loc) getPathConfig) {
@@ -151,14 +168,17 @@ set[tuple[str, str, PathConfig]] getQualifiedNameChanges(loc old, loc new, PathC
151168 };
152169}
153170
154- tuple [list [DocumentEdit ], set [Message ]] propagateModuleRenames (list [ tuple [ loc old , loc new ] ] renames , set [loc ] workspaceFolders , PathConfig (loc ) getPathConfig ) {
155- rel [str oldName , str newName , PathConfig pcfg ] qualifiedNameChanges = {
171+ tuple [list [DocumentEdit ], set [Message ]] propagateModuleRenames (lrel [ loc old , loc new ] renames , set [loc ] workspaceFolders , PathConfig (loc ) getPathConfig ) {
172+ lrel [str oldName , str newName , PathConfig pcfg ] qualifiedNameChanges = [
156173 rename
157174 | <oldLoc , newLoc > <- renames
158175 , tuple [str , str , PathConfig ] rename <- getQualifiedNameChanges (oldLoc , newLoc , getPathConfig )
159- };
176+ ];
177+
178+ set [Message ] messages = {};
179+ void registerMessage (Message msg ) { messages += msg ; }
160180
161- set [PathConfig ] projectWithRenamedModule = qualifiedNameChanges .pcfg ;
181+ list [PathConfig ] projectWithRenamedModule = qualifiedNameChanges .pcfg ;
162182 set [DocumentEdit ] edits = flatMap (workspaceFolders , set [DocumentEdit ](loc wsFolder ) {
163183 PathConfig wsFolderPcfg = getPathConfig (wsFolder );
164184
@@ -167,10 +187,9 @@ tuple[list[DocumentEdit], set[Message]] propagateModuleRenames(list[tuple[loc ol
167187
168188 return {changed (file , changes )
169189 | loc file <- find (wsFolder , "rsc" )
170- , changes := getChanges (file , wsFolderPcfg , qualifiedNameChanges )
171- , changes != []
190+ , changes :[_, *_] := getChanges (file , wsFolderPcfg , qualifiedNameChanges , registerMessage )
172191 };
173192 });
174193
175- return <toList (edits ), {} >;
194+ return <any ( msg <- messages , msg is error ) ? [] : toList (edits ), messages > ;
176195}
0 commit comments