From 39abf755d51213e5072cae8789a0c67a233328a2 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Sat, 7 Mar 2009 11:18:01 +0300 Subject: [PATCH] I18n foldings --- plugins/java-i18n/src/META-INF/plugin.xml | 7 ++ .../i18n/folding/PropertyFoldingBuilder.java | 78 ++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 plugins/java-i18n/src/com/intellij/codeInspection/i18n/folding/PropertyFoldingBuilder.java diff --git a/plugins/java-i18n/src/META-INF/plugin.xml b/plugins/java-i18n/src/META-INF/plugin.xml index 6d86bb4903..1e74ceac54 100644 --- a/plugins/java-i18n/src/META-INF/plugin.xml +++ b/plugins/java-i18n/src/META-INF/plugin.xml @@ -16,7 +16,14 @@ implementationClass="com.intellij.lang.properties.PropertiesReferenceProvider"/> + + + + com.intellij.codeInspection.i18n.folding.I18nMessageFoldingPassFactory + + + diff --git a/plugins/java-i18n/src/com/intellij/codeInspection/i18n/folding/PropertyFoldingBuilder.java b/plugins/java-i18n/src/com/intellij/codeInspection/i18n/folding/PropertyFoldingBuilder.java new file mode 100644 index 0000000000..ecd9305546 --- /dev/null +++ b/plugins/java-i18n/src/com/intellij/codeInspection/i18n/folding/PropertyFoldingBuilder.java @@ -0,0 +1,78 @@ +package com.intellij.codeInspection.i18n.folding; + +import com.intellij.lang.folding.FoldingBuilder; +import com.intellij.lang.folding.FoldingDescriptor; +import com.intellij.lang.ASTNode; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.util.Ref; +import com.intellij.psi.*; +import com.intellij.psi.impl.source.SourceTreeToPsiMap; +import com.intellij.codeInsight.AnnotationUtil; +import com.intellij.codeInspection.i18n.JavaI18nUtil; + +import java.util.*; + +/** + * @author Konstantin Bulenkov + */ +public class PropertyFoldingBuilder implements FoldingBuilder { + public FoldingDescriptor[] buildFoldRegions(ASTNode node, Document document) { + final PsiElement element = node.getPsi(); + if (!(element instanceof PsiJavaFile)) { + return FoldingDescriptor.EMPTY; + } + final PsiJavaFile file = (PsiJavaFile) element; + final List result = new ArrayList(); + + file.accept(new JavaRecursiveElementWalkingVisitor() { + @Override + public void visitLiteralExpression(PsiLiteralExpression expression) { + final Map annotationParams = new HashMap(); + annotationParams.put(AnnotationUtil.PROPERTY_KEY_RESOURCE_BUNDLE_PARAMETER, null); + final PsiElement parent = expression.getParent(); + if (JavaI18nUtil.mustBePropertyKey(expression, annotationParams) && parent instanceof PsiExpressionList) { + if (((PsiExpressionList)parent).getExpressions().length == 1 && parent.getParent() instanceof PsiMethodCallExpression) { + final PsiMethodCallExpression expr = (PsiMethodCallExpression)parent.getParent(); + result.add(new FoldingDescriptor(expr.getNode(), expr.getTextRange())); + } + } + } + }); + + return result.toArray(new FoldingDescriptor[result.size()]); + } + + + + public String getPlaceholderText(ASTNode node) { + final PsiElement element = SourceTreeToPsiMap.treeElementToPsi(node); + if (element instanceof PsiMethodCallExpression) { + return getI18nMessage((PsiMethodCallExpression)element); + } + return element.getText(); + } + + private static String getI18nMessage(PsiMethodCallExpression methodCallExpression) { + final PsiExpression[] expressions = methodCallExpression.getArgumentList().getExpressions(); + if (expressions.length == 1 && expressions[0] instanceof PsiLiteralExpression) { + final PsiLiteralExpression literalExpr = (PsiLiteralExpression)expressions[0]; + final Object value = literalExpr.getValue(); + if (value instanceof String) { + final String key = (String)value; + final Ref ref = new Ref(); + if (JavaI18nUtil.isValidPropertyReference(literalExpr, key, ref)) { + final ResourceBundle bundle = ResourceBundle.getBundle(ref.get()); + final String property = (bundle == null) ? null : bundle.getString(key); + if (property != null) { + return "\"" + property + "\""; + } + } + } + } + return methodCallExpression.getText(); + } + + public boolean isCollapsedByDefault(ASTNode node) { + return true; + } +} -- 2.11.4.GIT