From c28c6d87a799b9e6331ba7ede59f9218a30d4c7d Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Thu, 6 Feb 2025 07:30:14 +0100 Subject: [PATCH] GH-1463: support concatenated strings while extracting request mapping path information --- .../ide/vscode/boot/java/utils/ASTUtils.java | 10 +++++---- .../RequestMappingSymbolProviderTest.java | 14 ++++++++++++ .../test/MappingsWithConcatenatedStrings.java | 22 +++++++++++++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 headless-services/spring-boot-language-server/src/test/resources/test-projects/test-request-mapping-symbols/src/main/java/org/test/MappingsWithConcatenatedStrings.java diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/ASTUtils.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/ASTUtils.java index 3a99f2b04..718020a4b 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/ASTUtils.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/ASTUtils.java @@ -224,12 +224,14 @@ public class ASTUtils { else if (exp instanceof SimpleName) { return ((SimpleName) exp).getIdentifier(); } - else { - return null; - } } else { - return null; + Object constValue = exp.resolveConstantExpressionValue(); + if (constValue != null) { + return constValue.toString(); + } } + + return null; } @SuppressWarnings("unchecked") diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingSymbolProviderTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingSymbolProviderTest.java index 782a54485..953f19dad 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingSymbolProviderTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingSymbolProviderTest.java @@ -383,6 +383,20 @@ public class RequestMappingSymbolProviderTest { assertTrue(containsSymbol(symbols, "@/produce3 - Content-Type: text/plain,testproducetype", docUri, 33, 1, 33, 94)); assertTrue(containsSymbol(symbols, "@/everything - Accept: application/json,text/plain,testconsume - Content-Type: application/json", docUri, 38, 1, 38, 170)); } + + @Test + void testPathWithConcatenatedString() throws Exception { + String docUri = directory.toPath().resolve("src/main/java/org/test/MappingsWithConcatenatedStrings.java").toUri().toString(); + List symbols = indexer.getSymbols(docUri); + assertTrue(containsSymbol(symbols, "@/path1/path2 -- GET", docUri, 13, 1, 13, 33)); + } + + @Test + void testPathWithConcatenatedStringAndConstantInvolved() throws Exception { + String docUri = directory.toPath().resolve("src/main/java/org/test/MappingsWithConcatenatedStrings.java").toUri().toString(); + List symbols = indexer.getSymbols(docUri); + assertTrue(containsSymbol(symbols, "@/path1/path/from/constant -- GET", docUri, 17, 1, 17, 56)); + } private boolean containsSymbol(List symbols, String name, String uri, int startLine, int startCHaracter, int endLine, int endCharacter) { for (Iterator iterator = symbols.iterator(); iterator.hasNext();) { diff --git a/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-request-mapping-symbols/src/main/java/org/test/MappingsWithConcatenatedStrings.java b/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-request-mapping-symbols/src/main/java/org/test/MappingsWithConcatenatedStrings.java new file mode 100644 index 000000000..b98e1d07d --- /dev/null +++ b/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-request-mapping-symbols/src/main/java/org/test/MappingsWithConcatenatedStrings.java @@ -0,0 +1,22 @@ +package org.test; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import static org.springframework.web.bind.annotation.RequestMethod.PUT; + +public class MappingsWithConcatenatedStrings { + + @GetMapping("/path1" + "/path2") + public void concatenatedPathMapping() { + } + + @GetMapping("/path1/" + Constants.REQUEST_MAPPING_PATH) + public void concatenatedPathMappingWithConstant() { + } + +}