[jvm] API draft 3
authorDaniil Ovchinnikov <daniil.ovchinnikov@jetbrains.com>
Mon, 10 Jul 2017 10:51:58 +0000 (13:51 +0300)
committerDaniil Ovchinnikov <daniil.ovchinnikov@jetbrains.com>
Mon, 10 Jul 2017 10:57:50 +0000 (13:57 +0300)
28 files changed:
java/java-psi-api/src/com/intellij/lang/jvm/JvmAnnotatedElement.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/JvmAnnotation.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/JvmClass.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/JvmClassKind.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/JvmConstructor.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/JvmElement.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/JvmExecutableMember.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/JvmField.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/JvmMember.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/JvmMethod.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/JvmModifier.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/JvmModifiersOwner.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/JvmNamedElement.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/JvmParameter.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/JvmTypeDeclarator.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/JvmTypeParameter.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/JvmTypeParametersOwner.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/package-info.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/types/JvmArrayType.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/types/JvmClassType.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/types/JvmGenericResolveResult.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/types/JvmPrimitiveType.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/types/JvmReferenceType.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/types/JvmSubstitutor.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/types/JvmType.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/types/JvmTypeResolveResult.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/types/JvmWildcardType.java [new file with mode: 0644]
java/java-psi-api/src/com/intellij/lang/jvm/types/package-info.java [new file with mode: 0644]

diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/JvmAnnotatedElement.java b/java/java-psi-api/src/com/intellij/lang/jvm/JvmAnnotatedElement.java
new file mode 100644 (file)
index 0000000..c0a09da
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm;
+
+import org.jetbrains.annotations.NotNull;
+
+public interface JvmAnnotatedElement extends JvmElement {
+
+  @NotNull
+  JvmAnnotation[] getAnnotations();
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/JvmAnnotation.java b/java/java-psi-api/src/com/intellij/lang/jvm/JvmAnnotation.java
new file mode 100644 (file)
index 0000000..59e4ad5
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm;
+
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.Nullable;
+
+public interface JvmAnnotation extends JvmElement {
+
+  /**
+   * Returns the fully qualified name of the annotation class.
+   *
+   * @return the class name, or null if the annotation is unresolved.
+   */
+  @Nullable
+  @NonNls
+  String getQualifiedName();
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/JvmClass.java b/java/java-psi-api/src/com/intellij/lang/jvm/JvmClass.java
new file mode 100644 (file)
index 0000000..7fec10a
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm;
+
+import com.intellij.lang.jvm.types.JvmClassType;
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public interface JvmClass extends JvmTypeParametersOwner, JvmTypeDeclarator {
+
+  @NotNull
+  @NonNls
+  String getQualifiedName();
+
+  @NotNull
+  JvmClassKind classKind();
+
+  @Nullable
+  JvmClassType superClassType();
+
+  @NotNull
+  Iterable<JvmClassType> interfaceTypes();
+
+  //
+
+  @NotNull
+  JvmConstructor[] getConstructors();
+
+  @NotNull
+  JvmMethod[] getMethods();
+
+  @NotNull
+  JvmField[] getFields();
+
+  @NotNull
+  JvmClass[] getInnerClasses();
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/JvmClassKind.java b/java/java-psi-api/src/com/intellij/lang/jvm/JvmClassKind.java
new file mode 100644 (file)
index 0000000..18cddb4
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm;
+
+public enum JvmClassKind {
+  CLASS,
+  INTERFACE,
+  ANNOTATION,
+  ENUM
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/JvmConstructor.java b/java/java-psi-api/src/com/intellij/lang/jvm/JvmConstructor.java
new file mode 100644 (file)
index 0000000..48e6bb4
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm;
+
+/**
+ * @see java.lang.reflect.Constructor
+ */
+public interface JvmConstructor extends JvmExecutableMember {
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/JvmElement.java b/java/java-psi-api/src/com/intellij/lang/jvm/JvmElement.java
new file mode 100644 (file)
index 0000000..b9e12b6
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm;
+
+import com.intellij.lang.Language;
+import com.intellij.pom.PomTarget;
+import com.intellij.psi.PsiElement;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Base interface for all JVM elements.
+ * <p>
+ * JVM element represents a compiled element from perspective of the JVM.
+ */
+public interface JvmElement extends PomTarget {
+
+  @NotNull
+  Language getLanguage();
+
+  @Nullable
+  PsiElement getPsiElement();
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/JvmExecutableMember.java b/java/java-psi-api/src/com/intellij/lang/jvm/JvmExecutableMember.java
new file mode 100644 (file)
index 0000000..850b895
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm;
+
+import com.intellij.lang.jvm.types.JvmReferenceType;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Represents a method or a constructor.
+ *
+ * @see java.lang.reflect.Executable
+ */
+public interface JvmExecutableMember extends JvmTypeParametersOwner {
+
+  @NotNull
+  @Override
+  String getName();
+
+  @NotNull
+  Iterable<JvmParameter> parameters();
+
+  boolean isVarArgs();
+
+  @NotNull
+  Iterable<JvmReferenceType> throwsTypes();
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/JvmField.java b/java/java-psi-api/src/com/intellij/lang/jvm/JvmField.java
new file mode 100644 (file)
index 0000000..13b8667
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm;
+
+import com.intellij.lang.jvm.types.JvmType;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @see java.lang.reflect.Field
+ */
+public interface JvmField extends JvmMember {
+
+  @NotNull
+  @Override
+  String getName();
+
+  @NotNull
+  JvmType fieldType();
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/JvmMember.java b/java/java-psi-api/src/com/intellij/lang/jvm/JvmMember.java
new file mode 100644 (file)
index 0000000..bf5bc4c
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm;
+
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @see java.lang.reflect.Member
+ */
+public interface JvmMember extends JvmModifiersOwner, JvmNamedElement {
+
+  @Nullable
+  JvmClass getContainingClass();
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/JvmMethod.java b/java/java-psi-api/src/com/intellij/lang/jvm/JvmMethod.java
new file mode 100644 (file)
index 0000000..57d5d69
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm;
+
+import com.intellij.lang.jvm.types.JvmType;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @see java.lang.reflect.Method
+ */
+public interface JvmMethod extends JvmExecutableMember {
+
+  @NotNull
+  JvmType returnType();
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/JvmModifier.java b/java/java-psi-api/src/com/intellij/lang/jvm/JvmModifier.java
new file mode 100644 (file)
index 0000000..c17f183
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm;
+
+public enum JvmModifier {
+  PUBLIC,
+  PROTECTED,
+  PRIVATE,
+  PACKAGE_LOCAL,
+
+  STATIC,
+  ABSTRACT,
+  FINAL,
+  DEFAULT,
+
+  NATIVE,
+  SYNCHRONIZED,
+  STRICTFP,
+  TRANSIENT,
+  VOLATILE,
+  TRANSITIVE,
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/JvmModifiersOwner.java b/java/java-psi-api/src/com/intellij/lang/jvm/JvmModifiersOwner.java
new file mode 100644 (file)
index 0000000..2dfba38
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm;
+
+import org.jetbrains.annotations.NotNull;
+
+import static com.intellij.util.containers.ContainerUtil.containsIdentity;
+
+public interface JvmModifiersOwner extends JvmAnnotatedElement {
+
+  @NotNull
+  Iterable<JvmModifier> modifiers();
+
+  default boolean hasModifier(@NotNull JvmModifier modifier) {
+    return containsIdentity(modifiers(), modifier);
+  }
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/JvmNamedElement.java b/java/java-psi-api/src/com/intellij/lang/jvm/JvmNamedElement.java
new file mode 100644 (file)
index 0000000..de0358c
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm;
+
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.Nullable;
+
+public interface JvmNamedElement extends JvmElement {
+
+  @NonNls
+  @Nullable
+  String getName();
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/JvmParameter.java b/java/java-psi-api/src/com/intellij/lang/jvm/JvmParameter.java
new file mode 100644 (file)
index 0000000..6be2c88
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm;
+
+import com.intellij.lang.jvm.types.JvmType;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Represents method parameter.
+ */
+public interface JvmParameter extends JvmNamedElement, JvmModifiersOwner {
+
+  @NotNull
+  JvmType parameterType();
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/JvmTypeDeclarator.java b/java/java-psi-api/src/com/intellij/lang/jvm/JvmTypeDeclarator.java
new file mode 100644 (file)
index 0000000..82732c6
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Represents an element which declares a type, such as class or type parameter.
+ */
+public interface JvmTypeDeclarator extends JvmNamedElement, JvmAnnotatedElement {
+
+  @NotNull
+  @Override
+  String getName();
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/JvmTypeParameter.java b/java/java-psi-api/src/com/intellij/lang/jvm/JvmTypeParameter.java
new file mode 100644 (file)
index 0000000..e16437c
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm;
+
+import com.intellij.lang.jvm.types.JvmReferenceType;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @see java.lang.reflect.TypeVariable
+ */
+public interface JvmTypeParameter extends JvmTypeDeclarator {
+
+  @NotNull
+  Iterable<JvmReferenceType> bounds();
+
+  @Nullable
+  JvmTypeParametersOwner getOwner();
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/JvmTypeParametersOwner.java b/java/java-psi-api/src/com/intellij/lang/jvm/JvmTypeParametersOwner.java
new file mode 100644 (file)
index 0000000..5781cbc
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @see java.lang.reflect.GenericDeclaration
+ */
+public interface JvmTypeParametersOwner extends JvmMember {
+
+  @NotNull
+  JvmTypeParameter[] getTypeParameters();
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/package-info.java b/java/java-psi-api/src/com/intellij/lang/jvm/package-info.java
new file mode 100644 (file)
index 0000000..430ddc1
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2000-2017 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.
+ */
+@Experimental
+package com.intellij.lang.jvm;
+
+import org.jetbrains.annotations.ApiStatus.Experimental;
\ No newline at end of file
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/types/JvmArrayType.java b/java/java-psi-api/src/com/intellij/lang/jvm/types/JvmArrayType.java
new file mode 100644 (file)
index 0000000..7757650
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm.types;
+
+import org.jetbrains.annotations.NotNull;
+
+public interface JvmArrayType extends JvmType {
+
+  @NotNull
+  JvmType componentType();
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/types/JvmClassType.java b/java/java-psi-api/src/com/intellij/lang/jvm/types/JvmClassType.java
new file mode 100644 (file)
index 0000000..86bc37f
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm.types;
+
+import com.intellij.lang.jvm.JvmClass;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.lang.reflect.ParameterizedType;
+
+/**
+ * Represents a type which could be resolved into a class and optionally has type arguments.
+ * Such type appears in throws, bounds, extends, implements.
+ */
+public interface JvmClassType extends JvmReferenceType {
+
+  /**
+   * @see ParameterizedType#getRawType
+   */
+  @Nullable
+  @Override
+  default JvmClass resolve() {
+    JvmGenericResolveResult result = resolveType();
+    return result == null ? null : result.getDeclarator();
+  }
+
+  @Nullable
+  JvmGenericResolveResult resolveType();
+
+  /**
+   * @see ParameterizedType#getActualTypeArguments
+   */
+  @NotNull
+  Iterable<JvmType> getTypeArguments();
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/types/JvmGenericResolveResult.java b/java/java-psi-api/src/com/intellij/lang/jvm/types/JvmGenericResolveResult.java
new file mode 100644 (file)
index 0000000..345f5b2
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm.types;
+
+import com.intellij.lang.jvm.JvmClass;
+import org.jetbrains.annotations.NotNull;
+
+public interface JvmGenericResolveResult extends JvmTypeResolveResult {
+
+  @NotNull
+  @Override
+  JvmClass getDeclarator();
+
+  @NotNull
+  JvmSubstitutor getSubstitutor();
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/types/JvmPrimitiveType.java b/java/java-psi-api/src/com/intellij/lang/jvm/types/JvmPrimitiveType.java
new file mode 100644 (file)
index 0000000..9010a15
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm.types;
+
+/**
+ * Represents primitive types of Java virtual machine.
+ */
+public interface JvmPrimitiveType extends JvmType {
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/types/JvmReferenceType.java b/java/java-psi-api/src/com/intellij/lang/jvm/types/JvmReferenceType.java
new file mode 100644 (file)
index 0000000..bfa1c3f
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm.types;
+
+import com.intellij.lang.jvm.JvmTypeDeclarator;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Represents a type which could be resolved into a class or a type parameter.
+ * Such types appear in throws and bounds.
+ */
+public interface JvmReferenceType extends JvmType {
+
+  @Nullable
+  default JvmTypeDeclarator resolve() {
+    JvmTypeResolveResult result = resolveType();
+    return result == null ? null : result.getDeclarator();
+  }
+
+  @Nullable
+  JvmTypeResolveResult resolveType();
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/types/JvmSubstitutor.java b/java/java-psi-api/src/com/intellij/lang/jvm/types/JvmSubstitutor.java
new file mode 100644 (file)
index 0000000..73fd43e
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm.types;
+
+import com.intellij.lang.jvm.JvmTypeParameter;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public interface JvmSubstitutor {
+
+  @Nullable
+  JvmType substitute(@NotNull JvmTypeParameter typeParameter);
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/types/JvmType.java b/java/java-psi-api/src/com/intellij/lang/jvm/types/JvmType.java
new file mode 100644 (file)
index 0000000..94cc541
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm.types;
+
+import com.intellij.lang.jvm.JvmAnnotation;
+import org.jetbrains.annotations.NotNull;
+
+public interface JvmType {
+
+  @NotNull
+  JvmAnnotation[] getAnnotations();
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/types/JvmTypeResolveResult.java b/java/java-psi-api/src/com/intellij/lang/jvm/types/JvmTypeResolveResult.java
new file mode 100644 (file)
index 0000000..cd62815
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm.types;
+
+import com.intellij.lang.jvm.JvmTypeDeclarator;
+import org.jetbrains.annotations.NotNull;
+
+public interface JvmTypeResolveResult {
+
+  @NotNull
+  JvmTypeDeclarator getDeclarator();
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/types/JvmWildcardType.java b/java/java-psi-api/src/com/intellij/lang/jvm/types/JvmWildcardType.java
new file mode 100644 (file)
index 0000000..ed8263d
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2000-2017 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 com.intellij.lang.jvm.types;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.lang.reflect.WildcardType;
+
+/**
+ * Represents wildcard type, for example {@code ? extends Number} in {@code List<? extends Number>}.
+ *
+ * @see WildcardType
+ */
+public interface JvmWildcardType extends JvmType {
+
+  /**
+   * An upper bound that this wildcard imposes on type parameter value.<br>
+   * That is:
+   * <ul>
+   * <li> for {@code ? extends XXX}: {@code XXX}
+   * <li> for {@code ? super XXX}: {@code java.lang.Object}
+   * <li> for {@code ?}: {@code java.lang.Object}
+   * </ul>
+   * <p>
+   *
+   * @return an upper bound
+   * @see WildcardType#getUpperBounds
+   */
+  @NotNull
+  JvmType upperBound();
+
+  /**
+   * A lower bound that this wildcard imposes on type parameter value.<br>
+   * That is:
+   * <ul>
+   * <li> for {@code ? extends XXX}: empty iterable
+   * <li> for {@code ? super XXX}: {@code XXX}
+   * <li> for {@code ?}: null type
+   * </ul>
+   *
+   * @return a lower bound
+   * @see WildcardType#getLowerBounds()
+   */
+  @NotNull
+  JvmType lowerBound();
+}
diff --git a/java/java-psi-api/src/com/intellij/lang/jvm/types/package-info.java b/java/java-psi-api/src/com/intellij/lang/jvm/types/package-info.java
new file mode 100644 (file)
index 0000000..c92b958
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2000-2017 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.
+ */
+@Experimental
+package com.intellij.lang.jvm.types;
+
+import org.jetbrains.annotations.ApiStatus.Experimental;
\ No newline at end of file