From db2b558fb52a379d8f665c0cbd08ccf5486d34a2 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 31 Oct 2024 16:04:06 +0100 Subject: [PATCH 01/10] added some quickfixes for java modifiers and javaClass --- pom.xml | 2 +- .../rascalcore/check/CollectDeclaration.rsc | 27 +++++++++++++++---- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 17c789a4..ccb4657a 100644 --- a/pom.xml +++ b/pom.xml @@ -243,7 +243,7 @@ org.rascalmpl rascal - 0.40.11 + 0.40.13-SNAPSHOT diff --git a/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc b/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc index 5a54b13d..ba2dcfb1 100644 --- a/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc +++ b/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc @@ -320,20 +320,20 @@ void collect(current: (FunctionDeclaration) ``, Collec if(decl is abstract){ if("javaClass" in tagsMap){ if("java" notin modifiers){ - c.report(warning(decl.signature, "Missing modifier `java`")); + c.report(warning(decl.signature, "Missing modifier `java`", fixes=addJavaModifier(decl))); } if("test" in modifiers){ c.report(warning(decl.signature, "Modifier `test` cannot be used for Java functions")); } } else { c.report(warning(decl, "Empty function body")); - } + } } else { if("javaClass" in tagsMap){ - c.report(warning(decl.signature, "Redundant tag `javaClass`")); + c.report(warning(decl.signature, "Redundant tag `javaClass`", fixes=removeJavaClass(decl))); } if("java" in modifiers){ - c.report(warning(decl.signature, "Redundant modifier `java`")); + c.report(warning(decl.signature, "Redundant modifier `java`", fixes=removeJavaModifier(decl))); } } @@ -726,4 +726,21 @@ void collect (current: (Declaration) ` alias endUseTypeParameters(c); -} \ No newline at end of file +} + +/* Here are some quickfixes used above */ + +CodeAction addJavaModifier(FunctionDeclaration decl) = action( + title="add `java` modifier", + edits=[changed(decl.top, [replace(decl.signature.modifiers@\loc, "java ")])] +); + +CodeAction removeJavaModifier(FunctionDeclaration decl) = action( + title="remove `java` modifier", + edits=[changed(decl.top, [replace(l@\loc, "") | /l:(FunctionModifier) `java` := decl])] +); + +CodeAction removeJavaClass(FunctionDeclaration decl) = action( + title="remove @javaClass tag", + edits=[changed(decl.top, [replace(l@\loc, "") | /l:(Tag) `@javaClass` := decl])] +); \ No newline at end of file From 9db5751c8f2d895daacae139872dbdd6755f4a9a Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 31 Oct 2024 16:13:29 +0100 Subject: [PATCH 02/10] added three example quickfixes, untested --- .../library/lang/rascalcore/check/CollectDeclaration.rsc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc b/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc index ba2dcfb1..0cb58ba2 100644 --- a/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc +++ b/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc @@ -31,6 +31,7 @@ import Set; import String; import util::Reflective; +import util::IDEServices; // ---- Utilities ------------------------------------------------------------- @@ -320,7 +321,7 @@ void collect(current: (FunctionDeclaration) ``, Collec if(decl is abstract){ if("javaClass" in tagsMap){ if("java" notin modifiers){ - c.report(warning(decl.signature, "Missing modifier `java`", fixes=addJavaModifier(decl))); + c.report(warning(decl.signature, "Missing modifier `java`", fixes=[addJavaModifier(decl)])); } if("test" in modifiers){ c.report(warning(decl.signature, "Modifier `test` cannot be used for Java functions")); @@ -330,10 +331,10 @@ void collect(current: (FunctionDeclaration) ``, Collec } } else { if("javaClass" in tagsMap){ - c.report(warning(decl.signature, "Redundant tag `javaClass`", fixes=removeJavaClass(decl))); + c.report(warning(decl.signature, "Redundant tag `javaClass`", fixes=[removeJavaClass(decl)])); } if("java" in modifiers){ - c.report(warning(decl.signature, "Redundant modifier `java`", fixes=removeJavaModifier(decl))); + c.report(warning(decl.signature, "Redundant modifier `java`", fixes=[removeJavaModifier(decl)])); } } From cc59bccbad21989b72191e9bdf422559a1e8c23c Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 4 Nov 2024 12:10:08 +0100 Subject: [PATCH 03/10] fixes --- .../rascalcore/check/CollectDeclaration.rsc | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc b/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc index 0cb58ba2..9746fa4b 100644 --- a/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc +++ b/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc @@ -326,8 +326,13 @@ void collect(current: (FunctionDeclaration) ``, Collec if("test" in modifiers){ c.report(warning(decl.signature, "Modifier `test` cannot be used for Java functions")); } - } else { - c.report(warning(decl, "Empty function body")); + } + else if ("java" in modifiers && "javaClass" notin tagsMap) { + c.report(warning(decl.signature, "Missing @javaClass tag with Java function"), fixes=javaClassProposals(decl)); + } + else { + c.report(warning(decl, "Empty function body, without a `java` modifier or @javaClass tag."), + fixes=[addJavaModifier(decl), *javaClassProposals(decl)]); } } else { if("javaClass" in tagsMap){ @@ -733,15 +738,20 @@ void collect (current: (Declaration) ` alias CodeAction addJavaModifier(FunctionDeclaration decl) = action( title="add `java` modifier", - edits=[changed(decl.top, [replace(decl.signature.modifiers@\loc, "java ")])] + edits=[changed(decl@\loc.top, [replace(decl.signature.modifiers@\loc, "java ")])] ); CodeAction removeJavaModifier(FunctionDeclaration decl) = action( title="remove `java` modifier", - edits=[changed(decl.top, [replace(l@\loc, "") | /l:(FunctionModifier) `java` := decl])] + edits=[changed(decl@\loc.top, [replace(l@\loc, "") | /l:(FunctionModifier) `java` := decl])] ); CodeAction removeJavaClass(FunctionDeclaration decl) = action( title="remove @javaClass tag", - edits=[changed(decl.top, [replace(l@\loc, "") | /l:(Tag) `@javaClass` := decl])] -); \ No newline at end of file + edits=[changed(decl@\loc.top, [replace(l@\loc, "") | /l:(Tag) `@javaClass` := decl])] +); + +list[CodeAction] javaClassProposals(FunctionDeclaration decl) = [ + action(title="add missing ", edits=[replace(decl.tags@\loc.top(decl.tags@\loc.offset, 0), "\n")]) + | /t:(Tag) `@javaClass` := parseModule(decl@\loc.top) +]; \ No newline at end of file From b2675261c1df1749d0791d3f6bb66547ccc167b3 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Tue, 5 Nov 2024 14:55:27 +0100 Subject: [PATCH 04/10] bumped typepal --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 38379c1a..f4ce1b94 100644 --- a/pom.xml +++ b/pom.xml @@ -228,7 +228,7 @@ org.rascalmpl typepal - 0.14.7 + 0.14.8-SNAPSHOT io.usethesource @@ -243,7 +243,7 @@ org.rascalmpl rascal - 0.40.14 + 0.40.15 From 2ee93c2b3460aa40f1794c81a55347de998ae62a Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Tue, 5 Nov 2024 15:59:47 +0100 Subject: [PATCH 05/10] bugfix --- .../library/lang/rascalcore/check/CollectDeclaration.rsc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc b/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc index ded64d27..7cf469f8 100644 --- a/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc +++ b/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc @@ -335,11 +335,11 @@ void collect(current: (FunctionDeclaration) ``, Collec } } else if ("java" in modifiers && "javaClass" notin tagsMap) { - c.report(warning(decl.signature, "Missing @javaClass tag with Java function"), fixes=javaClassProposals(decl)); + c.report(warning(decl.signature, "Missing @javaClass tag with Java function", fixes=javaClassProposals(decl))); } else { - c.report(warning(decl, "Empty function body, without a `java` modifier or @javaClass tag."), - fixes=[addJavaModifier(decl), *javaClassProposals(decl)]); + c.report(warning(decl, "Empty function body, without a `java` modifier or @javaClass tag.", + fixes=[addJavaModifier(decl), *javaClassProposals(decl)])); } } else { if("javaClass" in tagsMap){ @@ -757,6 +757,6 @@ CodeAction removeJavaClass(FunctionDeclaration decl) = action( ); list[CodeAction] javaClassProposals(FunctionDeclaration decl) = [ - action(title="add missing ", edits=[replace(decl.tags@\loc.top(decl.tags@\loc.offset, 0), "\n")]) + action(title="add missing ", edits=[changed(decl@\loc.top, [replace(decl.tags@\loc.top(decl.tags@\loc.offset, 0), "\n")])]) | /t:(Tag) `@javaClass` := parseModule(decl@\loc.top) ]; \ No newline at end of file From 249329409c0fc2d4f10fbd0e5b9ec24936714fbd Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Tue, 5 Nov 2024 16:08:19 +0100 Subject: [PATCH 06/10] sort unique @javaClass suggestions --- .../core/library/lang/rascalcore/check/CollectDeclaration.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc b/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc index 7cf469f8..688c5e0f 100644 --- a/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc +++ b/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc @@ -757,6 +757,6 @@ CodeAction removeJavaClass(FunctionDeclaration decl) = action( ); list[CodeAction] javaClassProposals(FunctionDeclaration decl) = [ - action(title="add missing ", edits=[changed(decl@\loc.top, [replace(decl.tags@\loc.top(decl.tags@\loc.offset, 0), "\n")])]) - | /t:(Tag) `@javaClass` := parseModule(decl@\loc.top) + action(title="add missing ", edits=[changed(decl@\loc.top, [replace(decl.tags@\loc(decl.tags@\loc.offset, 0), "\n")])]) + | str a <- sort({"" | /t:(Tag) `@javaClass` := parseModule(decl@\loc.top)}) ]; \ No newline at end of file From 7a39a77d2787ad6f7b02594500734e2949b084a9 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Tue, 5 Nov 2024 16:17:22 +0100 Subject: [PATCH 07/10] added missing line/column information --- .../core/library/lang/rascalcore/check/CollectDeclaration.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc b/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc index 688c5e0f..05ade402 100644 --- a/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc +++ b/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc @@ -757,6 +757,6 @@ CodeAction removeJavaClass(FunctionDeclaration decl) = action( ); list[CodeAction] javaClassProposals(FunctionDeclaration decl) = [ - action(title="add missing ", edits=[changed(decl@\loc.top, [replace(decl.tags@\loc(decl.tags@\loc.offset, 0), "\n")])]) + action(title="add missing ", edits=[changed(decl@\loc.top, [replace(decl.tags@\loc(decl.tags@\loc.offset, 0, decl.tags@\loc.begin, decl.tags@\loc.begin), "\n")])]) | str a <- sort({"" | /t:(Tag) `@javaClass` := parseModule(decl@\loc.top)}) ]; \ No newline at end of file From 59bdddd42929d63450fd198d01e68b2266a3d1c8 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Tue, 5 Nov 2024 19:46:52 +0100 Subject: [PATCH 08/10] bumped rascal to 0.40.16 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e3296b2a..9fe538f9 100644 --- a/pom.xml +++ b/pom.xml @@ -243,7 +243,7 @@ org.rascalmpl rascal - 0.40.15 + 0.40.16 From 34be62d14a5ea4b1cfeb7ccbfde6c3f6f2efe2f4 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 6 Nov 2024 07:15:49 +0100 Subject: [PATCH 09/10] simplified action construction by using utility functions from TextEdits module --- .../lang/rascalcore/check/CollectDeclaration.rsc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc b/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc index 05ade402..eb5efd7c 100644 --- a/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc +++ b/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc @@ -743,20 +743,23 @@ void collect (current: (Declaration) ` alias CodeAction addJavaModifier(FunctionDeclaration decl) = action( title="add `java` modifier", - edits=[changed(decl@\loc.top, [replace(decl.signature.modifiers@\loc, "java ")])] + edits=[changed([insertBefore(decl.signature.modifiers@\loc, "java")])] ); CodeAction removeJavaModifier(FunctionDeclaration decl) = action( title="remove `java` modifier", - edits=[changed(decl@\loc.top, [replace(l@\loc, "") | /l:(FunctionModifier) `java` := decl])] + edits=[changed([delete(l@\loc) | /l:(FunctionModifier) `java` := decl])] ); CodeAction removeJavaClass(FunctionDeclaration decl) = action( title="remove @javaClass tag", - edits=[changed(decl@\loc.top, [replace(l@\loc, "") | /l:(Tag) `@javaClass` := decl])] + edits=[changed([delete(l@\loc) | /l:(Tag) `@javaClass` := decl])] ); list[CodeAction] javaClassProposals(FunctionDeclaration decl) = [ - action(title="add missing ", edits=[changed(decl@\loc.top, [replace(decl.tags@\loc(decl.tags@\loc.offset, 0, decl.tags@\loc.begin, decl.tags@\loc.begin), "\n")])]) + action( + title="add missing ", + edits=[changed([insertBefore(decl.tags@\loc, "", separator="\n")])] + ) | str a <- sort({"" | /t:(Tag) `@javaClass` := parseModule(decl@\loc.top)}) ]; \ No newline at end of file From 9b0cb2a559ad4f58fbe685602e54272c53cddd1a Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 6 Nov 2024 12:19:26 +0100 Subject: [PATCH 10/10] changed title --- .../core/library/lang/rascalcore/check/CollectDeclaration.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc b/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc index eb5efd7c..24b0a271 100644 --- a/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc +++ b/src/org/rascalmpl/core/library/lang/rascalcore/check/CollectDeclaration.rsc @@ -752,7 +752,7 @@ CodeAction removeJavaModifier(FunctionDeclaration decl) = action( ); CodeAction removeJavaClass(FunctionDeclaration decl) = action( - title="remove @javaClass tag", + title="remove ", edits=[changed([delete(l@\loc) | /l:(Tag) `@javaClass` := decl])] );