From 814eb9205080657645a475383d5c6ecf40768925 Mon Sep 17 00:00:00 2001 From: Cecil Lin Date: Wed, 20 Apr 2022 18:08:02 +0800 Subject: [PATCH] feat: navigation for class signature Add navigation for class signature. By the way, fix method navigation behavior. --- CHANGELOG.md | 4 +++ .../github/ceclin/bdlh/lang/BDLParser.java | 27 +++++++++++++++---- .../com/github/ceclin/bdlh/lang/BDL.bnf | 2 +- .../com/github/ceclin/bdlh/lang/ImplExt.kt | 8 +++--- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a053673..3b34773 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,11 +3,15 @@ # BDLH Changelog ## [Unreleased] +### Added +- Navigation for class signature + ### Changed - Update pluginIcon.svg ### Fixed - Subclasses resolving +- Method navigation behavior ## [0.1.0] ### Added diff --git a/src/main/gen/com/github/ceclin/bdlh/lang/BDLParser.java b/src/main/gen/com/github/ceclin/bdlh/lang/BDLParser.java index 0d9d5fa..f29391b 100644 --- a/src/main/gen/com/github/ceclin/bdlh/lang/BDLParser.java +++ b/src/main/gen/com/github/ceclin/bdlh/lang/BDLParser.java @@ -254,7 +254,7 @@ private static boolean root_0(PsiBuilder b, int l) { } /* ********************************************************** */ - // LA class_name COLON SPACE (method|field) RA + // LA class_name (COLON SPACE (method|field))? RA public static boolean signature(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "signature")) return false; if (!nextTokenIs(b, LA)) return false; @@ -262,16 +262,33 @@ public static boolean signature(PsiBuilder b, int l) { Marker m = enter_section_(b); r = consumeToken(b, LA); r = r && class_name(b, l + 1); - r = r && consumeTokens(b, 0, COLON, SPACE); - r = r && signature_4(b, l + 1); + r = r && signature_2(b, l + 1); r = r && consumeToken(b, RA); exit_section_(b, m, SIGNATURE, r); return r; } + // (COLON SPACE (method|field))? + private static boolean signature_2(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "signature_2")) return false; + signature_2_0(b, l + 1); + return true; + } + + // COLON SPACE (method|field) + private static boolean signature_2_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "signature_2_0")) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeTokens(b, 0, COLON, SPACE); + r = r && signature_2_0_2(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + // method|field - private static boolean signature_4(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "signature_4")) return false; + private static boolean signature_2_0_2(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "signature_2_0_2")) return false; boolean r; r = method(b, l + 1); if (!r) r = field(b, l + 1); diff --git a/src/main/kotlin/com/github/ceclin/bdlh/lang/BDL.bnf b/src/main/kotlin/com/github/ceclin/bdlh/lang/BDL.bnf index 38e9245..c81531e 100644 --- a/src/main/kotlin/com/github/ceclin/bdlh/lang/BDL.bnf +++ b/src/main/kotlin/com/github/ceclin/bdlh/lang/BDL.bnf @@ -35,7 +35,7 @@ root ::= (signature|fallback)* private fallback ::= LA | RA | LS | RS | LP | RP | DOT | SPACE | DOLLAR | COLON | COMMA | id | any -signature ::= LA class_name COLON SPACE (method|field) RA +signature ::= LA class_name (COLON SPACE (method|field))? RA {methods=[getReference]} class_name ::= type_name diff --git a/src/main/kotlin/com/github/ceclin/bdlh/lang/ImplExt.kt b/src/main/kotlin/com/github/ceclin/bdlh/lang/ImplExt.kt index a2d9e8a..36160f0 100644 --- a/src/main/kotlin/com/github/ceclin/bdlh/lang/ImplExt.kt +++ b/src/main/kotlin/com/github/ceclin/bdlh/lang/ImplExt.kt @@ -15,7 +15,7 @@ class RefToJava(element: BDLSignature) : PsiReferenceBase(element, } private fun resolveMethod(clazz: PsiClass, method: BDLMethod): PsiMethod? { - clazz.findMethodsByName(method.methodName.text, false).firstOrNull { + return clazz.findMethodsByName(method.methodName.text, false).firstOrNull { val parameter = method.parameter if (parameter == null) it.hasParameters() @@ -26,7 +26,6 @@ class RefToJava(element: BDLSignature) : PsiReferenceBase(element, } == parameter.text } } - return clazz.findMethodsByName(method.methodName.text, false).firstOrNull() } } @@ -36,8 +35,9 @@ class RefToJava(element: BDLSignature) : PsiReferenceBase(element, // I don't know what jvmCompatible means. No document for this param. val clazz = ClassUtil.findPsiClass(PsiManager.getInstance(project), className, null, true) ?: return null - return element.field?.let { resolveField(clazz, it) } - ?: element.method?.let { resolveMethod(clazz, it) } + element.field?.let { return resolveField(clazz, it) } + element.method?.let { return resolveMethod(clazz, it) } + return clazz } }