Skip to content

Commit fb9bf79

Browse files
authored
Merge pull request #711 from usethesource/fix/708-rename-constructor-names
Improve constructor rename checks
2 parents 23d0fbd + 8e6f935 commit fb9bf79

File tree

12 files changed

+65
-26
lines changed

12 files changed

+65
-26
lines changed

rascal-lsp/src/main/rascal/lsp/lang/rascal/lsp/refactor/Rename.rsc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,9 @@ void rascalCheckCausesOverlappingDefinitions(set[Define] currentDefs, str newNam
117117
}
118118
}
119119
120-
void rascalCheckLegalNameByRole(Define _:<_, _, _, role, at, _>, str name, Renamer r) {
120+
void rascalCheckLegalNameByRole(Define _:<_, _, _, role, at, dt>, str name, Renamer r) {
121121
escName = normalizeEscaping(name);
122-
<t, desc> = asType(role);
122+
<t, desc> = asType(role, dt);
123123
if (tryParseAs(t, escName) is nothing) {
124124
r.error(at, "<escName> is not a valid <desc>");
125125
}
@@ -336,9 +336,9 @@ set[Define] getCursorDefinitions(list[Tree] cursor, Tree(loc) _, TModel(Tree) _,
336336
337337
tuple[set[loc], set[loc], set[loc]] findOccurrenceFiles(set[Define] defs, list[Tree] cursor, str newName, Tree(loc) getTree, Renamer r) {
338338
escNewName = normalizeEscaping(newName);
339-
for (role <- defs.idRole) {
339+
for (<role, dt> <- defs<idRole, defInfo>) {
340340
hasError = false;
341-
<t, desc> = asType(role);
341+
<t, desc> = asType(role, dt);
342342
if (tryParseAs(t, escNewName) is nothing) {
343343
hasError = true;
344344
r.error(cursor[0], "\'<escNewName>\' is not a valid <desc>");

rascal-lsp/src/main/rascal/lsp/lang/rascal/lsp/refactor/rename/Constructors.rsc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,5 @@ set[Define] findAdditionalConstructorDefinitions(set[Define] cursorDefs, Tree tr
7777
});
7878
}
7979
80-
tuple[type[Tree] as, str desc] asType(constructorId()) = <#NonterminalLabel, "constructor name">;
80+
// ADT constructors
81+
tuple[type[Tree] as, str desc] asType(constructorId(), defType(acons(aadt(_, _, dataSyntax()), _, _))) = <#Name, "data constructor name">;

rascal-lsp/src/main/rascal/lsp/lang/rascal/lsp/refactor/rename/Fields.rsc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,10 +143,10 @@ TModel augmentFieldUses(Tree tr, TModel tm, TModel(loc) getModel) {
143143
}
144144
145145
// Positional fields
146-
tuple[type[Tree] as, str desc] asType(fieldId()) = <#NonterminalLabel, "field name">;
146+
tuple[type[Tree] as, str desc] asType(fieldId(), _) = <#NonterminalLabel, "field name">;
147147
148148
// Keyword fields
149-
tuple[type[Tree] as, str desc] asType(keywordFieldId()) = <#Name, "keyword field name">;
149+
tuple[type[Tree] as, str desc] asType(keywordFieldId(), _) = <#Name, "keyword field name">;
150150
151151
bool isUnsupportedCursor(list[Tree] _: [*_, Name n1, *_, (Expression) `<Expression _> has <Name n2>`, *_], Renamer _) = (n1 := n2);
152152

rascal-lsp/src/main/rascal/lsp/lang/rascal/lsp/refactor/rename/Functions.rsc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,4 @@ set[Define] findAdditionalDefinitions(set[Define] cursorDefs:{<_, _, _, function
5454
set[Define] findAdditionalFunctionDefinitions(set[Define] cursorDefs, TModel tm) =
5555
{tm.definitions[d] | loc d <- (tm.defines<idRole, defined>)[functionId()], rascalMayOverloadSameName(cursorDefs.defined + d, tm.definitions)};
5656
57-
tuple[type[Tree] as, str desc] asType(functionId()) = <#Name, "function name">;
57+
tuple[type[Tree] as, str desc] asType(functionId(), _) = <#Name, "function name">;

rascal-lsp/src/main/rascal/lsp/lang/rascal/lsp/refactor/rename/Grammars.rsc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,14 @@ void renameDefinitionUnchecked(Define d: <_, _, _, lexicalId(), _, _>, loc _, st
6161
}
6262

6363
// Non-terminals
64-
tuple[type[Tree] as, str desc] asType(nonterminalId()) = <#Nonterminal, "production name">;
64+
tuple[type[Tree] as, str desc] asType(nonterminalId(), _) = <#Nonterminal, "production name">;
6565

6666
// Lexicals
67-
tuple[type[Tree] as, str desc] asType(lexicalId()) = <#Nonterminal, "production name">;
67+
tuple[type[Tree] as, str desc] asType(lexicalId(), _) = <#Nonterminal, "production name">;
68+
69+
// Grammar constructors
70+
tuple[type[Tree] as, str desc] asType(constructorId(), defType(acons(aadt(_, _, syntaxRole), _, _))) = <#NonterminalLabel, "grammar constructor name">
71+
when !syntaxRole is dataSyntax;
6872

6973
TModel augmentExceptProductions(Tree tr, TModel tm, TModel(loc) tmodelForLoc) {
7074
top-down-break visit (tr) {

rascal-lsp/src/main/rascal/lsp/lang/rascal/lsp/refactor/rename/Modules.rsc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ import util::FileSystem;
4747
import util::Reflective;
4848
import util::Util;
4949

50-
tuple[type[Tree] as, str desc] asType(moduleId()) = <#QualifiedName, "module name">;
50+
tuple[type[Tree] as, str desc] asType(moduleId(), _) = <#QualifiedName, "module name">;
5151

5252
tuple[set[loc], set[loc], set[loc]] findOccurrenceFilesUnchecked(set[Define] _:{<_, str defName, _, moduleId(), loc d, _>}, list[Tree] cursor, str newName, Tree(loc) getTree, Renamer r) {
5353
set[loc] useFiles = {};

rascal-lsp/src/main/rascal/lsp/lang/rascal/lsp/refactor/rename/Parameters.rsc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import util::Maybe;
4141

4242
bool isFormalId(IdRole role) = role in formalRoles;
4343

44-
tuple[type[Tree] as, str desc] asType(IdRole idRole) = <#Name, "formal parameter name"> when isFormalId(idRole);
44+
tuple[type[Tree] as, str desc] asType(IdRole idRole, _) = <#Name, "formal parameter name"> when isFormalId(idRole);
4545

4646
tuple[set[loc], set[loc], set[loc]] findOccurrenceFilesUnchecked(set[Define] _:{<loc scope, _, _, IdRole role, _, _>}, list[Tree] cursor, str newName, Tree(loc) _, Renamer _) =
4747
<{scope.top}, {scope.top}, singleNameFilter(newName)(cursor[-1]) ? {scope.top} : {}>

rascal-lsp/src/main/rascal/lsp/lang/rascal/lsp/refactor/rename/Types.rsc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,10 @@ public set[Define] findAdditionalDataLikeDefinitions(set[Define] defs, TModel tm
8686
};
8787
}
8888
89-
tuple[type[Tree] as, str desc] asType(aliasId()) = <#Name, "type name">;
90-
tuple[type[Tree] as, str desc] asType(annoId()) = <#Name, "annotation name">;
91-
tuple[type[Tree] as, str desc] asType(dataId()) = <#Name, "ADT name">;
92-
tuple[type[Tree] as, str desc] asType(typeVarId()) = <#Name, "type variable name">;
89+
tuple[type[Tree] as, str desc] asType(aliasId(), _) = <#Name, "type name">;
90+
tuple[type[Tree] as, str desc] asType(annoId(), _) = <#Name, "annotation name">;
91+
tuple[type[Tree] as, str desc] asType(dataId(), _) = <#Name, "ADT name">;
92+
tuple[type[Tree] as, str desc] asType(typeVarId(), _) = <#Name, "type variable name">;
9393
9494
alias Environment = tuple[TModel tm, map[str, loc] defs];
9595

rascal-lsp/src/main/rascal/lsp/lang/rascal/lsp/refactor/rename/Variables.rsc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,21 +37,21 @@ import analysis::typepal::TModel;
3737
import util::Maybe;
3838

3939
// Variables
40-
tuple[type[Tree] as, str desc] asType(variableId()) = <#Name, "variable name">;
40+
tuple[type[Tree] as, str desc] asType(variableId(), _) = <#Name, "variable name">;
4141

4242
tuple[set[loc], set[loc], set[loc]] findOccurrenceFilesUnchecked(set[Define] _:{<loc scope, _, _, variableId(), _, _>}, list[Tree] cursor, str newName, Tree(loc) _, Renamer _) =
4343
<{scope.top}, {scope.top}, singleNameFilter(newName)(cursor[-1]) ? {scope.top} : {}>;
4444

4545
// Global variables
46-
tuple[type[Tree] as, str desc] asType(moduleVariableId()) = <#Name, "variable name">;
46+
tuple[type[Tree] as, str desc] asType(moduleVariableId(), _) = <#Name, "variable name">;
4747

4848
tuple[set[loc], set[loc], set[loc]] findOccurrenceFilesUnchecked(set[Define] _:{<loc scope, _, _, moduleVariableId(), _, defType(_, vis=privateVis())>}, list[Tree] cursor, str newName, Tree(loc) getTree, Renamer r) {
4949
<curUseFiles, newFiles> = filterFiles(getSourceFiles(r), "<cursor[0]>", newName, getTree);
5050
return <{scope.top}, curUseFiles, newFiles>;
5151
}
5252

5353
// Pattern variables
54-
tuple[type[Tree] as, str desc] asType(patternVariableId()) = <#Name, "pattern variable name">;
54+
tuple[type[Tree] as, str desc] asType(patternVariableId(), _) = <#Name, "pattern variable name">;
5555

5656
tuple[set[loc], set[loc], set[loc]] findOccurrenceFilesUnchecked(set[Define] _:{<loc scope, _, _, patternVariableId(), _, _>}, list[Tree] cursor, str newName, Tree(loc) _, Renamer _) =
5757
<{scope.top}, {scope.top}, singleNameFilter(newName)(cursor[-1]) ? {scope.top} : {}>;

rascal-lsp/src/main/rascal/lsp/lang/rascal/tests/rename/Constructors.rsc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@ module lang::rascal::tests::rename::Constructors
2929

3030
import lang::rascal::tests::rename::TestUtils;
3131

32+
test bool constructorPascalName() = testRenameOccurrences({0}, "", decls ="
33+
'data S = foo();
34+
", newName = "Foo");
35+
36+
test bool constructorUnderscoreName() = testRenameOccurrences({0}, "", decls ="
37+
'data S = foo();
38+
", newName = "_Foo");
39+
3240
test bool extendedConstructor() = testRenameOccurrences({
3341
byText("Definer", "data Foo = foo(int i);", {0})
3442
, byText("Extender",

0 commit comments

Comments
 (0)