| /* |
| * Copyright (c) 2010-2021 BSI Business Systems Integration AG. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * BSI Business Systems Integration AG - initial API and implementation |
| */ |
| package org.eclipse.scout.sdk.s2i.nls.folding |
| |
| import com.intellij.lang.folding.FoldingDescriptor |
| import com.intellij.psi.* |
| import com.intellij.psi.util.PsiTreeUtil |
| import org.eclipse.scout.sdk.core.s.nls.TranslationStoreStack |
| import org.eclipse.scout.sdk.s2i.nls.TranslationLanguageSpec.Companion.translationSpec |
| |
| class NlsFoldingBuilderForJava : AbstractNlsFoldingBuilder() { |
| |
| override fun buildFoldRegions(root: PsiElement, stack: TranslationStoreStack): List<FoldingDescriptor> { |
| val folds = ArrayList<FoldingDescriptor>() |
| root.accept(object : JavaRecursiveElementWalkingVisitor() { |
| override fun visitLiteralExpression(expression: PsiLiteralExpression) { |
| super.visitLiteralExpression(expression) |
| visitElement(expression) |
| } |
| |
| override fun visitReferenceExpression(expression: PsiReferenceExpression) { |
| super.visitReferenceExpression(expression) |
| visitElement(expression) |
| } |
| |
| override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { |
| super.visitMethodCallExpression(expression) |
| visitElement(expression) |
| } |
| |
| private fun visitElement(expression: PsiExpression) { |
| val translationKey = expression.translationSpec()?.resolveTranslationKey() ?: return |
| createFoldingDescriptor(translationKey, expression, stack)?.let { folds.add(it) } |
| } |
| }) |
| return folds |
| } |
| |
| private fun createFoldingDescriptor(key: String, literal: PsiExpression, stack: TranslationStoreStack): FoldingDescriptor? { |
| val methodCall = PsiTreeUtil.getParentOfType(literal, PsiMethodCallExpression::class.java) ?: return null |
| val element = if (methodCall.methodExpression.qualifierExpression is PsiReferenceExpression) methodCall else literal |
| return createFoldingDescriptor(element, key, stack) |
| } |
| } |