* @return real underlying database object behind the identifier.
*/
@Nullable
public synchronized DBObject resolveUnderlyingObject() {
DBObject underlyingObject = null;
PsiElement psiElement = resolve();
if (isObject()) {
if (psiElement instanceof DBObject) {
DBObject object = (DBObject) psiElement;
underlyingObject = object.getUndisposedElement();
} else if (psiElement instanceof IdentifierPsiElement) {
IdentifierPsiElement identifierPsiElement = (IdentifierPsiElement) psiElement;
PsiElement underlyingPsiElement = identifierPsiElement.resolve();
if (underlyingPsiElement instanceof DBObject) {
underlyingObject = (DBObject) underlyingPsiElement;
}
}
} else if (isAlias()) {
BasePsiElement aliasDefinition;
if (isDefinition()) {
aliasDefinition = this;
} else {
BasePsiElement resolveScope = getEnclosingScopePsiElement();
PsiLookupAdapter lookupAdapter = new AliasDefinitionLookupAdapter(this, getObjectType(), getUnquotedText());
aliasDefinition = lookupAdapter.findInScope(resolveScope);
}
if (aliasDefinition != null && aliasDefinition instanceof IdentifierPsiElement) {
BasePsiElement aliasedObject = PsiUtil.resolveAliasedEntityElement((IdentifierPsiElement) aliasDefinition);
if (aliasedObject != null) {
if (aliasedObject.isVirtualObject()) {
return aliasedObject.resolveUnderlyingObject();
} else if (aliasedObject instanceof IdentifierPsiElement) {
IdentifierPsiElement identifierPsiElement = (IdentifierPsiElement) aliasedObject;
PsiElement underlyingPsiElement = identifierPsiElement.resolve();
if (underlyingPsiElement != null && underlyingPsiElement instanceof DBObject) {
underlyingObject = (DBObject) underlyingPsiElement;
}
}
}