/* * Copyright 2000-2009 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.psi.impl.source.tree; import com.intellij.lang.ASTNode; import com.intellij.psi.*; import com.intellij.psi.impl.source.SourceJavaCodeReference; import com.intellij.util.CharTable; public class JavaSourceUtil { private JavaSourceUtil() { } public static void fullyQualifyReference(final CompositeElement reference, final PsiClass targetClass) { if (((SourceJavaCodeReference)reference).isQualified()) { // qualified reference final PsiClass parentClass = targetClass.getContainingClass(); if (parentClass == null) return; final ASTNode qualifier = reference.findChildByRole(ChildRole.QUALIFIER); if (qualifier instanceof SourceJavaCodeReference) { ((SourceJavaCodeReference)qualifier).fullyQualify(parentClass); } } else { // unqualified reference, need to qualify with package name final String qName = targetClass.getQualifiedName(); if (qName == null) { return; // todo: local classes? } final int i = qName.lastIndexOf('.'); if (i > 0) { final String prefix = qName.substring(0, i); final PsiManager manager = reference.getManager(); final PsiJavaParserFacade parserFacade = JavaPsiFacade.getInstance(manager.getProject()).getParserFacade(); final TreeElement qualifier; if (reference instanceof PsiReferenceExpression) { qualifier = (TreeElement)parserFacade.createExpressionFromText(prefix, null).getNode(); } else { qualifier = (TreeElement)parserFacade.createReferenceFromText(prefix, null).getNode(); } if (qualifier != null) { final CharTable systemCharTab = SharedImplUtil.findCharTableByTree(qualifier); final LeafElement dot = Factory.createSingleLeafElement(JavaTokenType.DOT, ".", 0, 1, systemCharTab, manager); qualifier.rawInsertAfterMe(dot); reference.addInternal(qualifier, dot, null, Boolean.FALSE); } } } } }