lang-api
[idea/community.git] / platform / lang-api / src / com / intellij / pom / references / PomReference.java
1 /*
2  * Copyright (c) 2000-2005 by JetBrains s.r.o. All Rights Reserved.
3  * Use is subject to license terms.
4  */
5 package com.intellij.pom.references;
6
7 import com.intellij.codeInsight.completion.CompletionParameters;
8 import com.intellij.codeInsight.completion.CompletionResultSet;
9 import com.intellij.codeInsight.lookup.LookupElement;
10 import com.intellij.openapi.application.ApplicationManager;
11 import com.intellij.openapi.util.Computable;
12 import com.intellij.openapi.util.TextRange;
13 import com.intellij.pom.PomNamedTarget;
14 import com.intellij.pom.PomTarget;
15 import com.intellij.psi.PsiElement;
16 import org.jetbrains.annotations.NotNull;
17 import org.jetbrains.annotations.Nullable;
18
19 /**
20  * @author peter
21  */
22 public abstract class PomReference {
23   public static final PomReference[] EMPTY_ARRAY = new PomReference[0];
24
25   private final PsiElement myElement;
26   private final TextRange myRangeInElement;
27
28   protected PomReference(PsiElement element, TextRange rangeInElement) {
29     myElement = element;
30     myRangeInElement = rangeInElement;
31   }
32
33   protected PomReference(PsiElement element) {
34     this(element, PomReferenceUtil.getDefaultRangeInElement(element));
35   }
36
37   public final PsiElement getElement() {
38     return myElement;
39   }
40
41   public final TextRange getRangeInElement() {
42     return myRangeInElement;
43   }
44
45   @Nullable
46   public abstract PomTarget resolve();
47
48   @NotNull
49   public abstract PomTarget[] multiResolve();
50
51   public abstract boolean isReferenceTo(@NotNull PomTarget target);
52
53   public void bindToElement(@NotNull PomTarget target) {
54     if (target instanceof PomNamedTarget) {
55       final PomNamedTarget namedTarget = (PomNamedTarget)target;
56       PomReferenceUtil.changeContent(this, namedTarget.getName());
57     }
58     throw new UnsupportedOperationException("Cannot bind reference " + this + " to unnamed target " + target);
59   }
60
61   public void processVariants(@NotNull CompletionResultSet result, @NotNull CompletionParameters parameters) {
62     final LookupElement[] elements = ApplicationManager.getApplication().runReadAction(new Computable<LookupElement[]>() {
63       public LookupElement[] compute() {
64         return getVariants();
65       }
66     });
67     for (final LookupElement element : elements) {
68       result.addElement(element);
69     }
70   }
71
72   @NotNull
73   public LookupElement[] getVariants() {
74     return LookupElement.EMPTY_ARRAY;
75   }
76 }