From a0ee9be3e5dca8656192e478d91ddc5a55bfae0d Mon Sep 17 00:00:00 2001 From: Daniel Espendiller Date: Mon, 9 Jun 2025 11:24:52 +0200 Subject: [PATCH] Fix read thread access of Twig lookup elements rendering --- .../PhpTwigMethodLookupElement.java | 23 +++++++++++-------- .../templating/util/TwigTypeResolveUtil.java | 20 +++++++++------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/PhpTwigMethodLookupElement.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/PhpTwigMethodLookupElement.java index 994cedfda..7386e898d 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/PhpTwigMethodLookupElement.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/PhpTwigMethodLookupElement.java @@ -8,31 +8,36 @@ import fr.adrienbrault.idea.symfony2plugin.templating.util.TwigTypeResolveUtil; import fr.adrienbrault.idea.symfony2plugin.util.completion.TwigTypeInsertHandler; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author Daniel Espendiller */ public class PhpTwigMethodLookupElement extends PhpLookupElement { + @Nullable + private String methodName; + PhpTwigMethodLookupElement(@NotNull PhpNamedElement namedElement) { super(namedElement); + + if (namedElement instanceof Method method) { + this.methodName = method.getName(); + } } @Override - public void handleInsert(InsertionContext context) { + public void handleInsert(@NotNull InsertionContext context) { TwigTypeInsertHandler.getInstance().handleInsert(context, this); } @Override - public void renderElement(LookupElementPresentation presentation) { + public void renderElement(@NotNull LookupElementPresentation presentation) { super.renderElement(presentation); - PhpNamedElement phpNamedElement = this.getNamedElement(); - // reset method to show full name again, which was stripped inside getLookupString - if(phpNamedElement instanceof Method && TwigTypeResolveUtil.isPropertyShortcutMethod((Method) phpNamedElement)) { - presentation.setItemText(phpNamedElement.getName()); + if (methodName != null && TwigTypeResolveUtil.isPropertyShortcutMethod(methodName)) { + presentation.setItemText(methodName); } - } @NotNull @@ -40,8 +45,8 @@ public String getLookupString() { String lookupString = super.getLookupString(); // remove property shortcuts eg getter / issers - if(this.getNamedElement() instanceof Method && TwigTypeResolveUtil.isPropertyShortcutMethod((Method) this.getNamedElement())) { - lookupString = TwigTypeResolveUtil.getPropertyShortcutMethodName((Method) this.getNamedElement()); + if (methodName != null && TwigTypeResolveUtil.isPropertyShortcutMethod(methodName)) { + lookupString = TwigTypeResolveUtil.getPropertyShortcutMethodName(methodName); } return lookupString; diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/util/TwigTypeResolveUtil.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/util/TwigTypeResolveUtil.java index d5627df2a..f5e712521 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/util/TwigTypeResolveUtil.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/util/TwigTypeResolveUtil.java @@ -658,9 +658,12 @@ public static String getTypeDisplayName(Project project, Set types) { } public static boolean isPropertyShortcutMethod(Method method) { + return isPropertyShortcutMethod(method.getName()); + } - for(String shortcut: PROPERTY_SHORTCUTS) { - if(method.getName().startsWith(shortcut) && method.getName().length() > shortcut.length()) { + public static boolean isPropertyShortcutMethod(String methodName) { + for (String shortcut: PROPERTY_SHORTCUTS) { + if (methodName.startsWith(shortcut) && methodName.length() > shortcut.length()) { return true; } } @@ -669,9 +672,8 @@ public static boolean isPropertyShortcutMethod(Method method) { } public static boolean isPropertyShortcutMethodEqual(String methodName, String variableName) { - - for(String shortcut: PROPERTY_SHORTCUTS) { - if(methodName.equalsIgnoreCase(shortcut + variableName)) { + for (String shortcut: PROPERTY_SHORTCUTS) { + if (methodName.equalsIgnoreCase(shortcut + variableName)) { return true; } } @@ -688,11 +690,13 @@ public static boolean isPropertyShortcutMethodEqual(String methodName, String va */ @NotNull public static String getPropertyShortcutMethodName(@NotNull Method method) { - String methodName = method.getName(); + return getPropertyShortcutMethodName(method.getName()); + } - for(String shortcut: PROPERTY_SHORTCUTS) { + public static String getPropertyShortcutMethodName(@NotNull String methodName) { + for (String shortcut: PROPERTY_SHORTCUTS) { // strip possible property shortcut and make it lcfirst - if(method.getName().startsWith(shortcut) && method.getName().length() > shortcut.length()) { + if (methodName.startsWith(shortcut) && methodName.length() > shortcut.length()) { methodName = methodName.substring(shortcut.length()); return Character.toLowerCase(methodName.charAt(0)) + methodName.substring(1); }