001 /*
002 * Copyright 2010-2013 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.jet.lang.resolve.java.resolver;
018
019 import com.intellij.psi.PsiExpression;
020 import com.intellij.psi.PsiField;
021 import com.intellij.psi.PsiLiteralExpression;
022 import org.jetbrains.annotations.NotNull;
023 import org.jetbrains.annotations.Nullable;
024 import org.jetbrains.jet.lang.descriptors.*;
025 import org.jetbrains.jet.lang.resolve.AnnotationUtils;
026 import org.jetbrains.jet.lang.resolve.BindingContextUtils;
027 import org.jetbrains.jet.lang.resolve.BindingTrace;
028 import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
029 import org.jetbrains.jet.lang.resolve.java.JavaBindingContext;
030 import org.jetbrains.jet.lang.resolve.java.JavaNamespaceKind;
031 import org.jetbrains.jet.lang.resolve.java.structure.JavaClass;
032 import org.jetbrains.jet.lang.resolve.java.structure.JavaElement;
033 import org.jetbrains.jet.lang.resolve.java.structure.JavaField;
034 import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod;
035 import org.jetbrains.jet.lang.resolve.java.structure.impl.JavaClassImpl;
036 import org.jetbrains.jet.lang.resolve.java.structure.impl.JavaElementImpl;
037 import org.jetbrains.jet.lang.resolve.java.structure.impl.JavaFieldImpl;
038 import org.jetbrains.jet.lang.resolve.java.structure.impl.JavaMethodImpl;
039 import org.jetbrains.jet.lang.resolve.name.FqName;
040
041 import javax.inject.Inject;
042
043 import static org.jetbrains.jet.lang.resolve.BindingContext.*;
044
045 public class TraceBasedJavaResolverCache implements JavaResolverCache {
046 private BindingTrace trace;
047
048 @Inject
049 public void setTrace(BindingTrace trace) {
050 this.trace = trace;
051 }
052
053 @Nullable
054 @Override
055 public ClassDescriptor getClassResolvedFromSource(@NotNull FqName fqName) {
056 return trace.get(FQNAME_TO_CLASS_DESCRIPTOR, fqName);
057 }
058
059 @Nullable
060 @Override
061 public NamespaceDescriptor getPackageResolvedFromSource(@NotNull FqName fqName) {
062 return trace.get(FQNAME_TO_NAMESPACE_DESCRIPTOR, fqName);
063 }
064
065 @Nullable
066 @Override
067 public SimpleFunctionDescriptor getMethod(@NotNull JavaMethod method) {
068 return trace.get(FUNCTION, ((JavaMethodImpl) method).getPsi());
069 }
070
071 @Nullable
072 @Override
073 public ConstructorDescriptor getConstructor(@NotNull JavaElement constructor) {
074 return trace.get(CONSTRUCTOR, ((JavaElementImpl) constructor).getPsi());
075 }
076
077 @Nullable
078 @Override
079 public ClassDescriptor getClass(@NotNull JavaClass javaClass) {
080 return trace.get(CLASS, ((JavaClassImpl) javaClass).getPsi());
081 }
082
083 @Override
084 public void recordMethod(@NotNull JavaMethod method, @NotNull SimpleFunctionDescriptor descriptor) {
085 BindingContextUtils.recordFunctionDeclarationToDescriptor(trace, ((JavaMethodImpl) method).getPsi(), descriptor);
086 }
087
088 @Override
089 public void recordConstructor(@NotNull JavaElement element, @NotNull ConstructorDescriptor descriptor) {
090 trace.record(CONSTRUCTOR, ((JavaElementImpl) element).getPsi(), descriptor);
091 }
092
093 @Override
094 public void recordField(@NotNull JavaField field, @NotNull PropertyDescriptor descriptor) {
095 PsiField psiField = ((JavaFieldImpl) field).getPsi();
096 trace.record(VARIABLE, psiField, descriptor);
097
098 if (AnnotationUtils.isPropertyAcceptableAsAnnotationParameter(descriptor)) {
099 PsiExpression initializer = psiField.getInitializer();
100 if (initializer instanceof PsiLiteralExpression) {
101 CompileTimeConstant<?> constant = JavaAnnotationArgumentResolver
102 .resolveCompileTimeConstantValue(((PsiLiteralExpression) initializer).getValue(), descriptor.getType());
103 if (constant != null) {
104 trace.record(COMPILE_TIME_INITIALIZER, descriptor, constant);
105 }
106 }
107 }
108 }
109
110 @Override
111 public void recordClass(@NotNull JavaClass javaClass, @NotNull ClassDescriptor descriptor) {
112 trace.record(CLASS, ((JavaClassImpl) javaClass).getPsi(), descriptor);
113 }
114
115 @Override
116 public void recordProperNamespace(@NotNull NamespaceDescriptor descriptor) {
117 trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, descriptor, JavaNamespaceKind.PROPER);
118 }
119
120 @Override
121 public void recordClassStaticMembersNamespace(@NotNull NamespaceDescriptor descriptor) {
122 trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, descriptor, JavaNamespaceKind.CLASS_STATICS);
123 }
124
125 @Override
126 public void recordPackage(@NotNull JavaElement element, @NotNull NamespaceDescriptor descriptor) {
127 trace.record(NAMESPACE, ((JavaElementImpl) element).getPsi(), descriptor);
128 }
129 }