diff --git a/java/java-impl/src/com/intellij/psi/impl/PsiJavaParserFacadeImpl.java b/java/java-impl/src/com/intellij/psi/impl/PsiJavaParserFacadeImpl.java index acc40b73b1a5..72478d75e96c 100644 --- a/java/java-impl/src/com/intellij/psi/impl/PsiJavaParserFacadeImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/PsiJavaParserFacadeImpl.java @@ -71,6 +71,13 @@ public class PsiJavaParserFacadeImpl extends PsiParserFacadeImpl implements PsiJ } }; + public static final JavaParserUtil.ParserWrapper REFERENCE = new JavaParserUtil.ParserWrapper() { + @Override + public void parse(final PsiBuilder builder) { + ReferenceParser.parseJavaCodeReference(builder, false, true, false, false, false); + } + }; + private static final JavaParserUtil.ParserWrapper TYPE_PARAMETER = new JavaParserUtil.ParserWrapper() { @Override public void parse(final PsiBuilder builder) { @@ -224,21 +231,35 @@ public class PsiJavaParserFacadeImpl extends PsiParserFacadeImpl implements PsiJ return createTypeInner(text, context, false); } - protected PsiType createTypeInner(final String text, final PsiElement context, final boolean markAsCopy) throws IncorrectOperationException { - final PsiPrimitiveType primitiveType = PRIMITIVE_TYPES.get(text); - if (primitiveType != null) return primitiveType; - + @NotNull + public PsiTypeElement createTypeElementFromText(@NotNull final String text, final PsiElement context) throws IncorrectOperationException { final DummyHolder holder = DummyHolderFactory.createHolder(myManager, new JavaDummyElement(text, TYPE, false), context); final PsiElement element = SourceTreeToPsiMap.treeElementToPsi(holder.getTreeElement().getFirstChildNode()); if (!(element instanceof PsiTypeElement)) { throw new IncorrectOperationException("Incorrect type \"" + text + "\"."); } + return (PsiTypeElement)element; + } + protected PsiType createTypeInner(final String text, final PsiElement context, final boolean markAsCopy) throws IncorrectOperationException { + final PsiPrimitiveType primitiveType = PRIMITIVE_TYPES.get(text); + if (primitiveType != null) return primitiveType; + + final PsiTypeElement element = createTypeElementFromText(text, context); if (markAsCopy) { - holder.getTreeElement().acceptTree(new GeneratedMarkerVisitor()); + ((TreeElement)element.getNode()).acceptTree(new GeneratedMarkerVisitor()); } + return element.getType(); + } - return ((PsiTypeElement)element).getType(); + @NotNull + public PsiJavaCodeReferenceElement createReferenceFromText(@NotNull final String text, final PsiElement context) throws IncorrectOperationException { + final DummyHolder holder = DummyHolderFactory.createHolder(myManager, new JavaDummyElement(text, REFERENCE, false), context); + final PsiElement element = SourceTreeToPsiMap.treeElementToPsi(holder.getTreeElement().getFirstChildNode()); + if (!(element instanceof PsiJavaCodeReferenceElement)) { + throw new IncorrectOperationException("Incorrect reference \"" + text + "\"."); + } + return (PsiJavaCodeReferenceElement)element; } @NotNull diff --git a/java/openapi/src/com/intellij/psi/PsiJavaParserFacade.java b/java/openapi/src/com/intellij/psi/PsiJavaParserFacade.java index 676de126bfba..3d9e0307f916 100644 --- a/java/openapi/src/com/intellij/psi/PsiJavaParserFacade.java +++ b/java/openapi/src/com/intellij/psi/PsiJavaParserFacade.java @@ -128,6 +128,30 @@ public interface PsiJavaParserFacade extends PsiParserFacade { @NotNull PsiType createTypeFromText(@NotNull @NonNls String text, PsiElement context) throws IncorrectOperationException; + /** + * Creates a Java type element from the specified text. + * + * @param text the text of the type to create (for example, a primitive type keyword, an array + * declaration or the name of a class). + * @param context the PSI element used as context for resolving the reference. + * @return the created type element. + * @throws com.intellij.util.IncorrectOperationException if the text does not specify a valid type. + */ + @NotNull + PsiTypeElement createTypeElementFromText(@NotNull @NonNls String text, PsiElement context) throws IncorrectOperationException; + + /** + * Creates a Java code reference from the specified text. + * + * @param text the text of the type to create (for example, a primitive type keyword, an array + * declaration or the name of a class). + * @param context the PSI element used as context for resolving the reference. + * @return the created reference element. + * @throws com.intellij.util.IncorrectOperationException if the text does not specify a valid type. + */ + @NotNull + PsiJavaCodeReferenceElement createReferenceFromText(@NotNull @NonNls String text, PsiElement context) throws IncorrectOperationException; + /** * Creates a Java code block from the specified text. *