From b51e02131c851237009d2e789d685e7f87e1ca3a Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 23 Aug 2012 12:55:11 +0200 Subject: [PATCH 1/2] change regexp to avoid SOE on long words with underscores (PY-6604) --- .../src/com/intellij/spellchecker/inspections/TextSplitter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/spellchecker/src/com/intellij/spellchecker/inspections/TextSplitter.java b/plugins/spellchecker/src/com/intellij/spellchecker/inspections/TextSplitter.java index ea7c75820e70..6327114829a9 100644 --- a/plugins/spellchecker/src/com/intellij/spellchecker/inspections/TextSplitter.java +++ b/plugins/spellchecker/src/com/intellij/spellchecker/inspections/TextSplitter.java @@ -31,7 +31,7 @@ public class TextSplitter extends BaseSplitter { return INSTANCE; } - private static final Pattern EXTENDED_WORD_AND_SPECIAL = Pattern.compile("([&#]|0x[0-9]*)?\\p{L}+'?\\p{L}(_*\\p{L})*"); + private static final Pattern EXTENDED_WORD_AND_SPECIAL = Pattern.compile("([&#]|0x[0-9]*)?\\p{L}+'?\\p{L}[_\\p{L}]*"); @Override public void split(@Nullable String text, @NotNull TextRange range, Consumer consumer) { From 4820ec81c3d71a95ee56bf2817cc5f4ec38d1d2f Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 23 Aug 2012 14:55:25 +0200 Subject: [PATCH 2/2] remove a whole bunch of duplicated code for finding the PSI element at live template context --- .../template/macro/ClassNameMacro.java | 8 +------- .../template/macro/MethodNameMacro.java | 15 +++++---------- .../template/macro/MethodParametersMacro.java | 14 ++++---------- .../template/macro/MethodReturnTypeMacro.java | 12 +----------- .../template/macro/QualifiedClassNameMacro.java | 15 +++++---------- .../codeInsight/template/ExpressionContext.java | 4 ++++ .../codeInsight/template/impl/TemplateState.java | 13 +++++++++++++ 7 files changed, 33 insertions(+), 48 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/template/macro/ClassNameMacro.java b/java/java-impl/src/com/intellij/codeInsight/template/macro/ClassNameMacro.java index 3eb68d9f23a4..f31ba20510e1 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/macro/ClassNameMacro.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/macro/ClassNameMacro.java @@ -17,7 +17,6 @@ package com.intellij.codeInsight.template.macro; import com.intellij.codeInsight.CodeInsightBundle; import com.intellij.codeInsight.template.*; -import com.intellij.openapi.project.Project; import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; @@ -32,14 +31,9 @@ public class ClassNameMacro extends Macro { } public Result calculateResult(@NotNull Expression[] params, final ExpressionContext context) { - Project project = context.getProject(); int templateStartOffset = context.getTemplateStartOffset(); int offset = templateStartOffset > 0 ? context.getTemplateStartOffset() - 1 : context.getTemplateStartOffset(); - - PsiDocumentManager.getInstance(project).commitAllDocuments(); - - PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(context.getEditor().getDocument()); - PsiElement place = file.findElementAt(offset); + PsiElement place = context.getPsiElementAtStartOffset(); PsiClass aClass = null; while(place != null){ diff --git a/java/java-impl/src/com/intellij/codeInsight/template/macro/MethodNameMacro.java b/java/java-impl/src/com/intellij/codeInsight/template/macro/MethodNameMacro.java index b248036d114b..8669d4d2a451 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/macro/MethodNameMacro.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/macro/MethodNameMacro.java @@ -18,8 +18,10 @@ package com.intellij.codeInsight.template.macro; import com.intellij.codeInsight.CodeInsightBundle; import com.intellij.codeInsight.template.*; import com.intellij.lang.LangBundle; -import com.intellij.openapi.project.Project; -import com.intellij.psi.*; +import com.intellij.psi.PsiClassInitializer; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiMethod; +import com.intellij.psi.PsiModifier; import org.jetbrains.annotations.NotNull; public class MethodNameMacro extends Macro { @@ -38,14 +40,7 @@ public class MethodNameMacro extends Macro { } public Result calculateResult(@NotNull Expression[] params, final ExpressionContext context) { - Project project = context.getProject(); - int templateStartOffset = context.getTemplateStartOffset(); - final int offset = templateStartOffset > 0 ? context.getTemplateStartOffset() - 1 : context.getTemplateStartOffset(); - - PsiDocumentManager.getInstance(project).commitAllDocuments(); - - PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(context.getEditor().getDocument()); - PsiElement place = file.findElementAt(offset); + PsiElement place = context.getPsiElementAtStartOffset(); while(place != null){ if (place instanceof PsiMethod){ return new TextResult(((PsiMethod)place).getName()); diff --git a/java/java-impl/src/com/intellij/codeInsight/template/macro/MethodParametersMacro.java b/java/java-impl/src/com/intellij/codeInsight/template/macro/MethodParametersMacro.java index 71d6fcd15ec0..8eba5bb8605e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/macro/MethodParametersMacro.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/macro/MethodParametersMacro.java @@ -17,8 +17,9 @@ package com.intellij.codeInsight.template.macro; import com.intellij.codeInsight.CodeInsightBundle; import com.intellij.codeInsight.template.*; -import com.intellij.openapi.project.Project; -import com.intellij.psi.*; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiMethod; +import com.intellij.psi.PsiParameter; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -40,14 +41,7 @@ public class MethodParametersMacro extends Macro { } public Result calculateResult(@NotNull Expression[] params, final ExpressionContext context) { - Project project = context.getProject(); - int templateStartOffset = context.getTemplateStartOffset(); - final int offset = templateStartOffset > 0 ? context.getTemplateStartOffset() - 1 : context.getTemplateStartOffset(); - - PsiDocumentManager.getInstance(project).commitAllDocuments(); - - PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(context.getEditor().getDocument()); - PsiElement place = file.findElementAt(offset); + PsiElement place = context.getPsiElementAtStartOffset(); while(place != null){ if (place instanceof PsiMethod){ List result = new ArrayList(); diff --git a/java/java-impl/src/com/intellij/codeInsight/template/macro/MethodReturnTypeMacro.java b/java/java-impl/src/com/intellij/codeInsight/template/macro/MethodReturnTypeMacro.java index e7c3e58e68e6..ec84b0b355db 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/macro/MethodReturnTypeMacro.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/macro/MethodReturnTypeMacro.java @@ -16,10 +16,7 @@ package com.intellij.codeInsight.template.macro; import com.intellij.codeInsight.template.*; -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; import com.intellij.psi.PsiMethod; import org.jetbrains.annotations.NotNull; @@ -41,14 +38,7 @@ public class MethodReturnTypeMacro extends Macro { } public Result calculateResult(@NotNull final Expression[] params, final ExpressionContext context) { - Project project = context.getProject(); - int templateStartOffset = context.getTemplateStartOffset(); - final int offset = templateStartOffset > 0 ? context.getTemplateStartOffset() - 1 : context.getTemplateStartOffset(); - - PsiDocumentManager.getInstance(project).commitAllDocuments(); - - PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(context.getEditor().getDocument()); - PsiElement place = file.findElementAt(offset); + PsiElement place = context.getPsiElementAtStartOffset(); while(place != null){ if (place instanceof PsiMethod){ return new PsiTypeResult(((PsiMethod)place).getReturnType(), place.getProject()); diff --git a/java/java-impl/src/com/intellij/codeInsight/template/macro/QualifiedClassNameMacro.java b/java/java-impl/src/com/intellij/codeInsight/template/macro/QualifiedClassNameMacro.java index 5e082ac2f9ec..856f622d0a78 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/macro/QualifiedClassNameMacro.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/macro/QualifiedClassNameMacro.java @@ -17,8 +17,10 @@ package com.intellij.codeInsight.template.macro; import com.intellij.codeInsight.CodeInsightBundle; import com.intellij.codeInsight.template.*; -import com.intellij.openapi.project.Project; -import com.intellij.psi.*; +import com.intellij.psi.PsiAnonymousClass; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiTypeParameter; import org.jetbrains.annotations.NotNull; public class QualifiedClassNameMacro extends Macro { @@ -32,14 +34,7 @@ public class QualifiedClassNameMacro extends Macro { } public Result calculateResult(@NotNull Expression[] params, final ExpressionContext context) { - Project project = context.getProject(); - int templateStartOffset = context.getTemplateStartOffset(); - final int offset = templateStartOffset > 0 ? context.getTemplateStartOffset() - 1 : context.getTemplateStartOffset(); - - PsiDocumentManager.getInstance(project).commitAllDocuments(); - - PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(context.getEditor().getDocument()); - PsiElement place = file.findElementAt(offset); + PsiElement place = context.getPsiElementAtStartOffset(); while(place != null){ if (place instanceof PsiClass && !(place instanceof PsiAnonymousClass) && !(place instanceof PsiTypeParameter)){ final PsiClass psiClass = ((PsiClass)place); diff --git a/platform/lang-api/src/com/intellij/codeInsight/template/ExpressionContext.java b/platform/lang-api/src/com/intellij/codeInsight/template/ExpressionContext.java index 51601e8e80f2..70840a1b243a 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/template/ExpressionContext.java +++ b/platform/lang-api/src/com/intellij/codeInsight/template/ExpressionContext.java @@ -19,7 +19,9 @@ package com.intellij.codeInsight.template; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.Nullable; public interface ExpressionContext { @NonNls Key SELECTION = Key.create("SELECTION"); @@ -30,5 +32,7 @@ public interface ExpressionContext { int getTemplateStartOffset(); int getTemplateEndOffset(); T getProperty(Key key); + @Nullable + PsiElement getPsiElementAtStartOffset(); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java index 4f1a9d64b845..171e7e5d3695 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateState.java @@ -793,6 +793,19 @@ public class TemplateState implements Disposable { public T getProperty(Key key) { return (T)myProperties.get(key); } + + @Nullable + @Override + public PsiElement getPsiElementAtStartOffset() { + Project project = getProject(); + int templateStartOffset = getTemplateStartOffset(); + int offset = templateStartOffset > 0 ? getTemplateStartOffset() - 1 : getTemplateStartOffset(); + + PsiDocumentManager.getInstance(project).commitAllDocuments(); + + PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(getEditor().getDocument()); + return file == null ? null : file.findElementAt(offset); + } }; }