001 /* 002 * Copyright 2010-2015 JetBrains s.r.o. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 package org.jetbrains.kotlin.asJava; 018 019 import com.intellij.openapi.util.Key; 020 import com.intellij.openapi.util.UserDataHolder; 021 import com.intellij.psi.*; 022 import com.intellij.psi.impl.compiled.ClsClassImpl; 023 import com.intellij.psi.impl.compiled.ClsEnumConstantImpl; 024 import com.intellij.psi.impl.compiled.ClsFieldImpl; 025 import com.intellij.psi.impl.compiled.ClsRepositoryPsiElement; 026 import com.intellij.psi.impl.java.stubs.*; 027 import com.intellij.psi.stubs.StubBase; 028 import com.intellij.psi.stubs.StubElement; 029 import org.jetbrains.annotations.NotNull; 030 import org.jetbrains.annotations.Nullable; 031 032 public class ClsWrapperStubPsiFactory extends StubPsiFactory { 033 public static final Key<LightElementOrigin> ORIGIN = Key.create("ORIGIN"); 034 private final StubPsiFactory delegate = new ClsStubPsiFactory(); 035 036 @Nullable 037 public static LightMemberOrigin getMemberOrigin(@NotNull PsiMember member) { 038 if (member instanceof ClsRepositoryPsiElement<?>) { 039 StubElement stubElement = ((ClsRepositoryPsiElement<?>) member).getStub(); 040 if (stubElement instanceof UserDataHolder) { 041 LightElementOrigin origin = ((UserDataHolder) stubElement).getUserData(ORIGIN); 042 if (origin instanceof LightMemberOrigin) { 043 return (LightMemberOrigin) origin; 044 } 045 } 046 } 047 048 return null; 049 } 050 051 @Override 052 public PsiClass createClass(@NotNull PsiClassStub stub) { 053 final PsiElement origin = getOriginalElement(stub); 054 return new ClsClassImpl(stub) { 055 @NotNull 056 @Override 057 public PsiElement getNavigationElement() { 058 if (origin != null) return origin; 059 060 return super.getNavigationElement(); 061 } 062 063 @Nullable 064 @Override 065 public PsiClass getSourceMirrorClass() { 066 return null; 067 } 068 }; 069 } 070 071 @Nullable 072 private static PsiElement getOriginalElement(@NotNull StubElement stub) { 073 LightElementOrigin origin = ((StubBase) stub).getUserData(ORIGIN); 074 return origin != null ? origin.getOriginalElement() : null; 075 } 076 077 @Override 078 public PsiAnnotation createAnnotation(PsiAnnotationStub stub) { 079 return delegate.createAnnotation(stub); 080 } 081 082 @Override 083 public PsiClassInitializer createClassInitializer(PsiClassInitializerStub stub) { 084 return delegate.createClassInitializer(stub); 085 } 086 087 @Override 088 public PsiReferenceList createClassReferenceList(PsiClassReferenceListStub stub) { 089 return delegate.createClassReferenceList(stub); 090 } 091 092 @Override 093 public PsiField createField(PsiFieldStub stub) { 094 final PsiElement origin = getOriginalElement(stub); 095 if (origin == null) return delegate.createField(stub); 096 if (stub.isEnumConstant()) { 097 return new ClsEnumConstantImpl(stub) { 098 @NotNull 099 @Override 100 public PsiElement getNavigationElement() { 101 return origin; 102 } 103 }; 104 } 105 else { 106 return new ClsFieldImpl(stub) { 107 @NotNull 108 @Override 109 public PsiElement getNavigationElement() { 110 return origin; 111 } 112 }; 113 } 114 } 115 116 @Override 117 public PsiImportList createImportList(PsiImportListStub stub) { 118 return delegate.createImportList(stub); 119 } 120 121 @Override 122 public PsiImportStatementBase createImportStatement(PsiImportStatementStub stub) { 123 return delegate.createImportStatement(stub); 124 } 125 126 @Override 127 public PsiMethod createMethod(PsiMethodStub stub) { 128 return delegate.createMethod(stub); 129 } 130 131 @Override 132 public PsiModifierList createModifierList(PsiModifierListStub stub) { 133 return delegate.createModifierList(stub); 134 } 135 136 @Override 137 public PsiParameter createParameter(PsiParameterStub stub) { 138 return delegate.createParameter(stub); 139 } 140 141 @Override 142 public PsiParameterList createParameterList(PsiParameterListStub stub) { 143 return delegate.createParameterList(stub); 144 } 145 146 @Override 147 public PsiTypeParameter createTypeParameter(PsiTypeParameterStub stub) { 148 return delegate.createTypeParameter(stub); 149 } 150 151 @Override 152 public PsiTypeParameterList createTypeParameterList(PsiTypeParameterListStub stub) { 153 return delegate.createTypeParameterList(stub); 154 } 155 156 @Override 157 public PsiAnnotationParameterList createAnnotationParameterList(PsiAnnotationParameterListStub stub) { 158 return delegate.createAnnotationParameterList(stub); 159 } 160 161 @Override 162 public PsiNameValuePair createNameValuePair(PsiNameValuePairStub stub) { 163 return delegate.createNameValuePair(stub); 164 } 165 }