IDEA-114710 Groovy: @Language annotation is not inserted before concatenated string on Alt+Enter

This commit is contained in:
Max Medvedev
2013-10-24 16:19:16 +04:00
parent 55f9f51843
commit b4d4dfbf87
2 changed files with 46 additions and 17 deletions
@@ -217,24 +217,32 @@ public class JavaLanguageInjectionSupport extends AbstractLanguageInjectionSuppo
final PsiModifierListOwner modifierListOwner,
@NotNull PsiLanguageInjectionHost host,
final String languageId) {
// todo add languageId comment
return doAddLanguageAnnotation(project, modifierListOwner, host, languageId, new Processor<PsiLanguageInjectionHost>() {
@Override
public boolean process(PsiLanguageInjectionHost host) {
final Configuration.AdvancedConfiguration configuration = Configuration.getProjectInstance(project).getAdvancedConfiguration();
boolean allowed = configuration.isSourceModificationAllowed();
configuration.setSourceModificationAllowed(true);
try {
return doInjectInJava(project, host, host, languageId);
}
finally {
configuration.setSourceModificationAllowed(allowed);
}
}
});
}
public static boolean doAddLanguageAnnotation(final Project project,
final PsiModifierListOwner modifierListOwner,
@NotNull PsiLanguageInjectionHost host,
final String languageId,
Processor<PsiLanguageInjectionHost> annotationFixer) {
if (modifierListOwner.getModifierList() == null || !PsiUtil.isLanguageLevel5OrHigher(modifierListOwner)) return false;
final Configuration.AdvancedConfiguration configuration = Configuration.getProjectInstance(project).getAdvancedConfiguration();
if (!configuration.isSourceModificationAllowed()) {
// todo add languageId comment
host.putUserData(InjectLanguageAction.FIX_KEY, new Processor<PsiLanguageInjectionHost>() {
@Override
public boolean process(PsiLanguageInjectionHost host) {
boolean allowed = configuration.isSourceModificationAllowed();
configuration.setSourceModificationAllowed(true);
try {
return doInjectInJava(project, host, host, languageId);
}
finally {
configuration.setSourceModificationAllowed(allowed);
}
}
});
host.putUserData(InjectLanguageAction.FIX_KEY, annotationFixer);
return false;
}
if (!OrderEntryFix.ensureAnnotationsJarInPath(ModuleUtilCore.findModuleForPsiElement(modifierListOwner))) {
@@ -23,6 +23,7 @@ import com.intellij.psi.*;
import com.intellij.psi.impl.light.LightElement;
import com.intellij.psi.tree.IElementType;
import com.intellij.util.NullableFunction;
import com.intellij.util.Processor;
import com.intellij.util.containers.ContainerUtil;
import org.intellij.plugins.intelliLang.Configuration;
import org.intellij.plugins.intelliLang.inject.AbstractLanguageInjectionSupport;
@@ -187,16 +188,36 @@ public class GroovyLanguageInjectionSupport extends AbstractLanguageInjectionSup
}
}
else {
if (parent instanceof PsiVariable) {
if (JavaLanguageInjectionSupport.doAddLanguageAnnotation(project, (PsiModifierListOwner)parent, host, languageId)) return true;
Processor<PsiLanguageInjectionHost> fixer = getAnnotationFixer(project, languageId);
if (JavaLanguageInjectionSupport.doAddLanguageAnnotation(project, (PsiModifierListOwner)parent, host, languageId, fixer)) return true;
}
else if (target instanceof PsiVariable && !(target instanceof LightElement)) {
if (JavaLanguageInjectionSupport.doAddLanguageAnnotation(project, (PsiModifierListOwner)target, host, languageId)) return true;
Processor<PsiLanguageInjectionHost> fixer = getAnnotationFixer(project, languageId);
if (JavaLanguageInjectionSupport.doAddLanguageAnnotation(project, (PsiModifierListOwner)target, host, languageId, fixer)) return true;
}
}
return false;
}
private static Processor<PsiLanguageInjectionHost> getAnnotationFixer(final Project project, final String languageId) {
return new Processor<PsiLanguageInjectionHost>() {
@Override
public boolean process(PsiLanguageInjectionHost host) {
final Configuration.AdvancedConfiguration configuration = Configuration.getProjectInstance(project).getAdvancedConfiguration();
boolean allowed = configuration.isSourceModificationAllowed();
configuration.setSourceModificationAllowed(true);
try {
return doInject(languageId, host, host);
}
finally {
configuration.setSourceModificationAllowed(allowed);
}
}
};
}
private static boolean isStringLiteral(PsiLanguageInjectionHost element) {
if (element instanceof GrStringContent) {
return true;