Add Project View and Navigation Bar enhancements
Add local declarations to Project View Show Kotlin file members in navigation bar (Fixed #KT-36218) Remove deprecated dependency
This commit is contained in:
@@ -0,0 +1,11 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.idea.codeInsight
|
||||||
|
|
||||||
|
import com.intellij.xml.breadcrumbs.BreadcrumbsInfoProvider
|
||||||
|
|
||||||
|
// BUNCH 201
|
||||||
|
typealias BreadcrumbsProviderCompatBase = BreadcrumbsInfoProvider
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.idea.codeInsight
|
||||||
|
|
||||||
|
import com.intellij.ide.ui.UISettings
|
||||||
|
import com.intellij.ui.breadcrumbs.BreadcrumbsProvider
|
||||||
|
|
||||||
|
// BUNCH 201
|
||||||
|
abstract class BreadcrumbsProviderCompatBase : BreadcrumbsProvider {
|
||||||
|
override fun isShownByDefault(): Boolean =
|
||||||
|
!UISettings.instance.showMembersInNavigationBar
|
||||||
|
}
|
||||||
@@ -1,17 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2016 JetBrains s.r.o.
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
*
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.jetbrains.kotlin.idea.codeInsight
|
package org.jetbrains.kotlin.idea.codeInsight
|
||||||
@@ -22,7 +11,6 @@ import com.intellij.psi.ElementDescriptionUtil
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.refactoring.util.RefactoringDescriptionLocation
|
import com.intellij.refactoring.util.RefactoringDescriptionLocation
|
||||||
import com.intellij.usageView.UsageViewShortNameLocation
|
import com.intellij.usageView.UsageViewShortNameLocation
|
||||||
import com.intellij.xml.breadcrumbs.BreadcrumbsInfoProvider
|
|
||||||
import org.jetbrains.kotlin.KtNodeTypes
|
import org.jetbrains.kotlin.KtNodeTypes
|
||||||
import org.jetbrains.kotlin.idea.KotlinBundle
|
import org.jetbrains.kotlin.idea.KotlinBundle
|
||||||
import org.jetbrains.kotlin.idea.KotlinLanguage
|
import org.jetbrains.kotlin.idea.KotlinLanguage
|
||||||
@@ -35,7 +23,8 @@ import org.jetbrains.kotlin.renderer.render
|
|||||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getValueArgumentsInParentheses
|
import org.jetbrains.kotlin.resolve.calls.callUtil.getValueArgumentsInParentheses
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
class KotlinBreadcrumbsInfoProvider : BreadcrumbsInfoProvider() {
|
// BUNCH 201
|
||||||
|
class KotlinBreadcrumbsInfoProvider : BreadcrumbsProviderCompatBase() {
|
||||||
private abstract class ElementHandler<TElement : KtElement>(val type: KClass<TElement>) {
|
private abstract class ElementHandler<TElement : KtElement>(val type: KClass<TElement>) {
|
||||||
abstract fun elementInfo(element: TElement): String
|
abstract fun elementInfo(element: TElement): String
|
||||||
abstract fun elementTooltip(element: TElement): String
|
abstract fun elementTooltip(element: TElement): String
|
||||||
|
|||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.idea.navigationToolbar
|
||||||
|
|
||||||
|
import com.intellij.ide.navigationToolbar.AbstractNavBarModelExtension
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
|
||||||
|
// BUNCH 201
|
||||||
|
abstract class AbstractNavBarModelExtensionCompatBase : AbstractNavBarModelExtension() {
|
||||||
|
|
||||||
|
protected abstract fun adjustElementImpl(psiElement: PsiElement?): PsiElement?
|
||||||
|
|
||||||
|
override fun adjustElement(psiElement: PsiElement): PsiElement? =
|
||||||
|
adjustElementImpl(psiElement)
|
||||||
|
}
|
||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.idea.navigationToolbar
|
||||||
|
|
||||||
|
import com.intellij.ide.navigationToolbar.StructureAwareNavBarModelExtension
|
||||||
|
import com.intellij.lang.Language
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.idea.KotlinLanguage
|
||||||
|
|
||||||
|
// BUNCH 201
|
||||||
|
abstract class AbstractNavBarModelExtensionCompatBase : StructureAwareNavBarModelExtension() {
|
||||||
|
|
||||||
|
protected abstract fun adjustElementImpl(psiElement: PsiElement?): PsiElement?
|
||||||
|
|
||||||
|
override fun adjustElement(psiElement: PsiElement): PsiElement? =
|
||||||
|
adjustElementImpl(psiElement)
|
||||||
|
|
||||||
|
override val language: Language
|
||||||
|
get() = KotlinLanguage.INSTANCE
|
||||||
|
}
|
||||||
@@ -5,21 +5,18 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.navigationToolbar
|
package org.jetbrains.kotlin.idea.navigationToolbar
|
||||||
|
|
||||||
import com.intellij.ide.navigationToolbar.AbstractNavBarModelExtension
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.idea.KotlinIconProvider
|
import org.jetbrains.kotlin.idea.KotlinIconProvider
|
||||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
import org.jetbrains.kotlin.idea.projectView.KtDeclarationTreeNode.Companion.tryGetRepresentableText
|
||||||
|
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
|
||||||
class KotlinNavBarModelExtension : AbstractNavBarModelExtension() {
|
// BUNCH 201
|
||||||
override fun getPresentableText(item: Any?): String? {
|
class KotlinNavBarModelExtension : AbstractNavBarModelExtensionCompatBase() {
|
||||||
return when (item) {
|
override fun getPresentableText(item: Any?): String? =
|
||||||
is KtClassOrObject -> item.name ?: "unknown"
|
(item as? KtDeclaration)?.let { tryGetRepresentableText(it, it.project) }
|
||||||
else -> null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun adjustElement(psiElement: PsiElement?): PsiElement? {
|
override fun adjustElementImpl(psiElement: PsiElement?): PsiElement? {
|
||||||
val containingFile = psiElement?.containingFile as? KtFile ?: return psiElement
|
val containingFile = psiElement?.containingFile as? KtFile ?: return psiElement
|
||||||
if (containingFile.isScript()) return psiElement
|
if (containingFile.isScript()) return psiElement
|
||||||
return KotlinIconProvider.getSingleClass(containingFile) ?: psiElement
|
return KotlinIconProvider.getSingleClass(containingFile) ?: psiElement
|
||||||
|
|||||||
-27
@@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.idea.navigationToolbar
|
|
||||||
|
|
||||||
import com.intellij.ide.navigationToolbar.AbstractNavBarModelExtension
|
|
||||||
import com.intellij.psi.PsiElement
|
|
||||||
import org.jetbrains.kotlin.idea.KotlinIconProvider
|
|
||||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
|
||||||
|
|
||||||
class KotlinNavBarModelExtension : AbstractNavBarModelExtension() {
|
|
||||||
override fun getPresentableText(item: Any?): String? {
|
|
||||||
return when (item) {
|
|
||||||
is KtClassOrObject -> item.name ?: "unknown"
|
|
||||||
else -> null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun adjustElement(psiElement: PsiElement): PsiElement? {
|
|
||||||
val containingFile = psiElement.containingFile as? KtFile ?: return psiElement
|
|
||||||
if (containingFile.isScript()) return psiElement
|
|
||||||
return KotlinIconProvider.getSingleClass(containingFile) ?: psiElement
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -34,8 +34,9 @@ class KtClassOrObjectTreeNode(project: Project?, ktClassOrObject: KtClassOrObjec
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun updateImpl(data: PresentationData) {
|
override fun updateImpl(data: PresentationData) {
|
||||||
|
val project = project ?: return
|
||||||
value?.let {
|
value?.let {
|
||||||
data.presentableText = it.name
|
data.presentableText = KtDeclarationTreeNode.tryGetRepresentableText(it, project)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,5 +76,7 @@ class KtClassOrObjectTreeNode(project: Project?, ktClassOrObject: KtClassOrObjec
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun expandOnDoubleClick(): Boolean = false
|
||||||
|
|
||||||
override fun getWeight() = 20
|
override fun getWeight() = 20
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,111 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2015 JetBrains s.r.o.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.idea.projectView;
|
|
||||||
|
|
||||||
import com.intellij.application.options.CodeStyle;
|
|
||||||
import com.intellij.ide.projectView.PresentationData;
|
|
||||||
import com.intellij.ide.projectView.ViewSettings;
|
|
||||||
import com.intellij.ide.projectView.impl.nodes.AbstractPsiBasedNode;
|
|
||||||
import com.intellij.ide.util.treeView.AbstractTreeNode;
|
|
||||||
import com.intellij.openapi.project.Project;
|
|
||||||
import com.intellij.psi.PsiElement;
|
|
||||||
import org.jetbrains.kotlin.idea.KotlinBundle;
|
|
||||||
import org.jetbrains.kotlin.idea.core.formatter.KotlinCodeStyleSettings;
|
|
||||||
import org.jetbrains.kotlin.psi.*;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class KtDeclarationTreeNode extends AbstractPsiBasedNode<KtDeclaration> {
|
|
||||||
public static final String CLASS_INITIALIZER = "<" + KotlinBundle.message("project.view.class.initializer") + ">";
|
|
||||||
|
|
||||||
protected KtDeclarationTreeNode(Project project, KtDeclaration ktDeclaration, ViewSettings viewSettings) {
|
|
||||||
super(project, ktDeclaration, viewSettings);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected PsiElement extractPsiFromValue() {
|
|
||||||
return getValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Collection<AbstractTreeNode> getChildrenImpl() {
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void updateImpl(PresentationData data) {
|
|
||||||
KtDeclaration declaration = getValue();
|
|
||||||
if (declaration != null) {
|
|
||||||
String text = declaration instanceof KtAnonymousInitializer ? CLASS_INITIALIZER : declaration.getName();
|
|
||||||
if (text == null) return;
|
|
||||||
|
|
||||||
KotlinCodeStyleSettings settings = CodeStyle.getSettings(getProject())
|
|
||||||
.getCustomSettings(KotlinCodeStyleSettings.class);
|
|
||||||
|
|
||||||
if (declaration instanceof KtProperty) {
|
|
||||||
KtProperty property = (KtProperty) declaration;
|
|
||||||
KtTypeReference ref = property.getTypeReference();
|
|
||||||
if (ref != null) {
|
|
||||||
if (settings.SPACE_BEFORE_TYPE_COLON) text += " ";
|
|
||||||
text += ":";
|
|
||||||
if (settings.SPACE_AFTER_TYPE_COLON) text += " ";
|
|
||||||
text += ref.getText();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (declaration instanceof KtFunction) {
|
|
||||||
KtFunction function = (KtFunction) declaration;
|
|
||||||
KtTypeReference receiverTypeRef = function.getReceiverTypeReference();
|
|
||||||
if (receiverTypeRef != null) {
|
|
||||||
text = receiverTypeRef.getText() + "." + text;
|
|
||||||
}
|
|
||||||
text += "(";
|
|
||||||
List<KtParameter> parameters = function.getValueParameters();
|
|
||||||
for (KtParameter parameter : parameters) {
|
|
||||||
if (parameter.getName() != null) {
|
|
||||||
text += parameter.getName();
|
|
||||||
if (settings.SPACE_BEFORE_TYPE_COLON) text += " ";
|
|
||||||
text += ":";
|
|
||||||
if (settings.SPACE_AFTER_TYPE_COLON) text += " ";
|
|
||||||
}
|
|
||||||
KtTypeReference typeReference = parameter.getTypeReference();
|
|
||||||
if (typeReference != null) {
|
|
||||||
text += typeReference.getText();
|
|
||||||
}
|
|
||||||
text += ", ";
|
|
||||||
}
|
|
||||||
if (parameters.size() > 0) text = text.substring(0, text.length() - 2);
|
|
||||||
text += ")";
|
|
||||||
KtTypeReference typeReference = function.getTypeReference();
|
|
||||||
if (typeReference != null) {
|
|
||||||
if (settings.SPACE_BEFORE_TYPE_COLON) text += " ";
|
|
||||||
text += ":";
|
|
||||||
if (settings.SPACE_AFTER_TYPE_COLON) text += " ";
|
|
||||||
text += typeReference.getText();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
data.setPresentableText(text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean isDeprecated() {
|
|
||||||
return KtPsiUtil.isDeprecated(getValue());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,111 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2015 JetBrains s.r.o.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.idea.projectView;
|
|
||||||
|
|
||||||
import com.intellij.application.options.CodeStyle;
|
|
||||||
import com.intellij.ide.projectView.PresentationData;
|
|
||||||
import com.intellij.ide.projectView.ViewSettings;
|
|
||||||
import com.intellij.ide.projectView.impl.nodes.AbstractPsiBasedNode;
|
|
||||||
import com.intellij.ide.util.treeView.AbstractTreeNode;
|
|
||||||
import com.intellij.openapi.project.Project;
|
|
||||||
import com.intellij.psi.PsiElement;
|
|
||||||
import org.jetbrains.kotlin.idea.KotlinBundle;
|
|
||||||
import org.jetbrains.kotlin.idea.core.formatter.KotlinCodeStyleSettings;
|
|
||||||
import org.jetbrains.kotlin.psi.*;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class KtDeclarationTreeNode extends AbstractPsiBasedNode<KtDeclaration> {
|
|
||||||
public static final String CLASS_INITIALIZER = "<" + KotlinBundle.message("project.view.class.initializer") + ">";
|
|
||||||
|
|
||||||
protected KtDeclarationTreeNode(Project project, KtDeclaration ktDeclaration, ViewSettings viewSettings) {
|
|
||||||
super(project, ktDeclaration, viewSettings);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected PsiElement extractPsiFromValue() {
|
|
||||||
return getValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Collection<AbstractTreeNode<?>> getChildrenImpl() {
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void updateImpl(PresentationData data) {
|
|
||||||
KtDeclaration declaration = getValue();
|
|
||||||
if (declaration != null) {
|
|
||||||
String text = declaration instanceof KtAnonymousInitializer ? CLASS_INITIALIZER : declaration.getName();
|
|
||||||
if (text == null) return;
|
|
||||||
|
|
||||||
KotlinCodeStyleSettings settings = CodeStyle.getSettings(getProject())
|
|
||||||
.getCustomSettings(KotlinCodeStyleSettings.class);
|
|
||||||
|
|
||||||
if (declaration instanceof KtProperty) {
|
|
||||||
KtProperty property = (KtProperty) declaration;
|
|
||||||
KtTypeReference ref = property.getTypeReference();
|
|
||||||
if (ref != null) {
|
|
||||||
if (settings.SPACE_BEFORE_TYPE_COLON) text += " ";
|
|
||||||
text += ":";
|
|
||||||
if (settings.SPACE_AFTER_TYPE_COLON) text += " ";
|
|
||||||
text += ref.getText();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (declaration instanceof KtFunction) {
|
|
||||||
KtFunction function = (KtFunction) declaration;
|
|
||||||
KtTypeReference receiverTypeRef = function.getReceiverTypeReference();
|
|
||||||
if (receiverTypeRef != null) {
|
|
||||||
text = receiverTypeRef.getText() + "." + text;
|
|
||||||
}
|
|
||||||
text += "(";
|
|
||||||
List<KtParameter> parameters = function.getValueParameters();
|
|
||||||
for (KtParameter parameter : parameters) {
|
|
||||||
if (parameter.getName() != null) {
|
|
||||||
text += parameter.getName();
|
|
||||||
if (settings.SPACE_BEFORE_TYPE_COLON) text += " ";
|
|
||||||
text += ":";
|
|
||||||
if (settings.SPACE_AFTER_TYPE_COLON) text += " ";
|
|
||||||
}
|
|
||||||
KtTypeReference typeReference = parameter.getTypeReference();
|
|
||||||
if (typeReference != null) {
|
|
||||||
text += typeReference.getText();
|
|
||||||
}
|
|
||||||
text += ", ";
|
|
||||||
}
|
|
||||||
if (parameters.size() > 0) text = text.substring(0, text.length() - 2);
|
|
||||||
text += ")";
|
|
||||||
KtTypeReference typeReference = function.getTypeReference();
|
|
||||||
if (typeReference != null) {
|
|
||||||
if (settings.SPACE_BEFORE_TYPE_COLON) text += " ";
|
|
||||||
text += ":";
|
|
||||||
if (settings.SPACE_AFTER_TYPE_COLON) text += " ";
|
|
||||||
text += typeReference.getText();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
data.setPresentableText(text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean isDeprecated() {
|
|
||||||
return KtPsiUtil.isDeprecated(getValue());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,149 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
package org.jetbrains.kotlin.idea.projectView
|
||||||
|
|
||||||
|
import com.intellij.application.options.CodeStyle
|
||||||
|
import com.intellij.ide.projectView.PresentationData
|
||||||
|
import com.intellij.ide.projectView.ViewSettings
|
||||||
|
import com.intellij.ide.projectView.impl.nodes.AbstractPsiBasedNode
|
||||||
|
import com.intellij.ide.util.treeView.AbstractTreeNode
|
||||||
|
import com.intellij.openapi.project.Project
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.idea.KotlinBundle
|
||||||
|
import org.jetbrains.kotlin.idea.core.formatter.KotlinCodeStyleSettings
|
||||||
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
|
||||||
|
internal class KtDeclarationTreeNode(
|
||||||
|
project: Project?,
|
||||||
|
ktDeclaration: KtDeclaration?,
|
||||||
|
viewSettings: ViewSettings?
|
||||||
|
) : AbstractPsiBasedNode<KtDeclaration?>(project, ktDeclaration!!, viewSettings) {
|
||||||
|
|
||||||
|
override fun extractPsiFromValue(): PsiElement? = value
|
||||||
|
|
||||||
|
override fun getChildrenImpl(): Collection<AbstractTreeNode<*>> {
|
||||||
|
val settings = settings
|
||||||
|
val project = project
|
||||||
|
|
||||||
|
if (!settings.isShowMembers) return emptyList()
|
||||||
|
val declaration = value ?: return emptyList()
|
||||||
|
|
||||||
|
val result = mutableListOf<AbstractTreeNode<*>>()
|
||||||
|
declaration.acceptChildren(object : KtTreeVisitorVoid() {
|
||||||
|
override fun visitClassOrObject(classOrObject: KtClassOrObject) {
|
||||||
|
result.add(
|
||||||
|
KtClassOrObjectTreeNode(
|
||||||
|
project = project,
|
||||||
|
ktClassOrObject = classOrObject,
|
||||||
|
viewSettings = settings
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visitNamedFunction(function: KtNamedFunction) {
|
||||||
|
result.add(
|
||||||
|
KtDeclarationTreeNode(
|
||||||
|
project = project,
|
||||||
|
ktDeclaration = function,
|
||||||
|
viewSettings = settings
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun updateImpl(data: PresentationData) {
|
||||||
|
val declaration = value ?: return
|
||||||
|
val project = project ?: return
|
||||||
|
data.presentableText = tryGetRepresentableText(declaration, project)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun expandOnDoubleClick(): Boolean = false
|
||||||
|
|
||||||
|
override fun isDeprecated(): Boolean = value?.let { KtPsiUtil.isDeprecated(it) } ?: false
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val CLASS_INITIALIZER = "<" + KotlinBundle.message("project.view.class.initializer") + ">"
|
||||||
|
|
||||||
|
fun tryGetRepresentableText(declaration: KtDeclaration, project: Project): String? {
|
||||||
|
|
||||||
|
val settings = CodeStyle.getSettings(project).getCustomSettings(KotlinCodeStyleSettings::class.java)
|
||||||
|
fun StringBuilder.appendColon() {
|
||||||
|
if (settings.SPACE_BEFORE_TYPE_COLON) append(" ")
|
||||||
|
append(":")
|
||||||
|
if (settings.SPACE_AFTER_TYPE_COLON) append(" ")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun KtProperty.presentableText() = buildString {
|
||||||
|
append(name)
|
||||||
|
typeReference?.text?.let { reference ->
|
||||||
|
appendColon()
|
||||||
|
append(reference)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun KtFunction.presentableText() = buildString {
|
||||||
|
receiverTypeReference?.text?.let { receiverReference ->
|
||||||
|
append(receiverReference)
|
||||||
|
append('.')
|
||||||
|
}
|
||||||
|
append(name)
|
||||||
|
append("(")
|
||||||
|
val valueParameters = valueParameters
|
||||||
|
valueParameters.forEachIndexed { index, parameter ->
|
||||||
|
parameter.name?.let { parameterName ->
|
||||||
|
append(parameterName)
|
||||||
|
appendColon()
|
||||||
|
}
|
||||||
|
parameter.typeReference?.text?.let { typeReference ->
|
||||||
|
append(typeReference)
|
||||||
|
}
|
||||||
|
if (index != valueParameters.size - 1) {
|
||||||
|
append(", ")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
append(")")
|
||||||
|
|
||||||
|
typeReference?.text?.let { returnTypeReference ->
|
||||||
|
appendColon()
|
||||||
|
append(returnTypeReference)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun KtObjectDeclaration.presentableText(): String? = buildString {
|
||||||
|
|
||||||
|
if (isCompanion()) {
|
||||||
|
append("companion object")
|
||||||
|
} else {
|
||||||
|
append("object")
|
||||||
|
if (!name.isNullOrEmpty()) {
|
||||||
|
append(" $name")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (superTypeListEntries.any()) {
|
||||||
|
appendColon()
|
||||||
|
val lastIndex = superTypeListEntries.size - 1
|
||||||
|
superTypeListEntries.forEachIndexed { index, entry ->
|
||||||
|
entry.typeReference?.text?.let {
|
||||||
|
if (index > 0 && index != lastIndex) append(", ")
|
||||||
|
append(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return when (declaration) {
|
||||||
|
is KtProperty -> declaration.presentableText()
|
||||||
|
is KtFunction -> declaration.presentableText()
|
||||||
|
is KtObjectDeclaration -> declaration.presentableText()
|
||||||
|
is KtAnonymousInitializer -> CLASS_INITIALIZER
|
||||||
|
else -> declaration.name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2015 JetBrains s.r.o.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.idea.projectView;
|
|
||||||
|
|
||||||
import com.intellij.ide.projectView.ViewSettings;
|
|
||||||
import com.intellij.ide.projectView.impl.nodes.PsiFileNode;
|
|
||||||
import com.intellij.ide.util.treeView.AbstractTreeNode;
|
|
||||||
import com.intellij.openapi.project.Project;
|
|
||||||
import org.jetbrains.kotlin.psi.KtClassOrObject;
|
|
||||||
import org.jetbrains.kotlin.psi.KtDeclaration;
|
|
||||||
import org.jetbrains.kotlin.psi.KtFile;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class KtFileTreeNode extends PsiFileNode {
|
|
||||||
public KtFileTreeNode(Project project, KtFile value, ViewSettings viewSettings) {
|
|
||||||
super(project, value, viewSettings);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final KtFile getKtFile() {
|
|
||||||
return (KtFile) getValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<AbstractTreeNode> getChildrenImpl() {
|
|
||||||
KtFile file = (KtFile) getValue();
|
|
||||||
|
|
||||||
if (file == null) return Collections.emptyList();
|
|
||||||
ArrayList<AbstractTreeNode> result = new ArrayList<AbstractTreeNode>();
|
|
||||||
|
|
||||||
if (getSettings().isShowMembers()) {
|
|
||||||
@SuppressWarnings("ConstantConditions") List<KtDeclaration> declarations = (file.isScript() ? file.getScript() : file).getDeclarations();
|
|
||||||
|
|
||||||
for (KtDeclaration declaration : declarations) {
|
|
||||||
if (declaration instanceof KtClassOrObject) {
|
|
||||||
result.add(new KtClassOrObjectTreeNode(file.getProject(), (KtClassOrObject) declaration, getSettings()));
|
|
||||||
}
|
|
||||||
else if (getSettings().isShowMembers()) {
|
|
||||||
result.add(new KtDeclarationTreeNode(getProject(), declaration, getSettings()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2015 JetBrains s.r.o.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.idea.projectView;
|
|
||||||
|
|
||||||
import com.intellij.ide.projectView.ViewSettings;
|
|
||||||
import com.intellij.ide.projectView.impl.nodes.PsiFileNode;
|
|
||||||
import com.intellij.ide.util.treeView.AbstractTreeNode;
|
|
||||||
import com.intellij.openapi.project.Project;
|
|
||||||
import org.jetbrains.kotlin.psi.KtClassOrObject;
|
|
||||||
import org.jetbrains.kotlin.psi.KtDeclaration;
|
|
||||||
import org.jetbrains.kotlin.psi.KtFile;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class KtFileTreeNode extends PsiFileNode {
|
|
||||||
public KtFileTreeNode(Project project, KtFile value, ViewSettings viewSettings) {
|
|
||||||
super(project, value, viewSettings);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final KtFile getKtFile() {
|
|
||||||
return (KtFile) getValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<AbstractTreeNode<?>> getChildrenImpl() {
|
|
||||||
KtFile file = (KtFile) getValue();
|
|
||||||
|
|
||||||
if (file == null) return Collections.emptyList();
|
|
||||||
ArrayList<AbstractTreeNode<?>> result = new ArrayList<>();
|
|
||||||
|
|
||||||
if (getSettings().isShowMembers()) {
|
|
||||||
@SuppressWarnings("ConstantConditions") List<KtDeclaration> declarations = (file.isScript() ? file.getScript() : file).getDeclarations();
|
|
||||||
|
|
||||||
for (KtDeclaration declaration : declarations) {
|
|
||||||
if (declaration instanceof KtClassOrObject) {
|
|
||||||
result.add(new KtClassOrObjectTreeNode(file.getProject(), (KtClassOrObject) declaration, getSettings()));
|
|
||||||
}
|
|
||||||
else if (getSettings().isShowMembers()) {
|
|
||||||
result.add(new KtDeclarationTreeNode(getProject(), declaration, getSettings()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
package org.jetbrains.kotlin.idea.projectView
|
||||||
|
|
||||||
|
import com.intellij.ide.projectView.ViewSettings
|
||||||
|
import com.intellij.ide.projectView.impl.nodes.PsiFileNode
|
||||||
|
import com.intellij.ide.util.treeView.AbstractTreeNode
|
||||||
|
import com.intellij.openapi.project.Project
|
||||||
|
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||||
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
|
||||||
|
class KtFileTreeNode(
|
||||||
|
project: Project?,
|
||||||
|
val ktFile: KtFile,
|
||||||
|
viewSettings: ViewSettings
|
||||||
|
) : PsiFileNode(project, ktFile, viewSettings) {
|
||||||
|
|
||||||
|
override fun getChildrenImpl(): Collection<AbstractTreeNode<*>> {
|
||||||
|
if (!settings.isShowMembers) return emptyList()
|
||||||
|
|
||||||
|
val declarations = (if (ktFile.isScript()) ktFile.script else ktFile)
|
||||||
|
?.declarations
|
||||||
|
?: return emptyList()
|
||||||
|
|
||||||
|
return declarations.map {
|
||||||
|
if (it is KtClassOrObject)
|
||||||
|
KtClassOrObjectTreeNode(project, it, settings)
|
||||||
|
else
|
||||||
|
KtDeclarationTreeNode(project, it, settings)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user