Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
硅谷海盗
kotlin
提交
1af0378c
K
kotlin
项目概览
硅谷海盗
/
kotlin
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kotlin
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
1af0378c
编写于
9月 09, 2011
作者:
D
Dmitry Jemerov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
extract references from PSI to plugin code
上级
93a6f947
变更
11
隐藏空白更改
内联
并排
Showing
11 changed file
with
353 addition
and
278 deletion
+353
-278
idea/META-INF/plugin.xml
idea/META-INF/plugin.xml
+0
-23
idea/src/META-INF/plugin.xml
idea/src/META-INF/plugin.xml
+1
-0
idea/src/org/jetbrains/jet/lang/psi/JetArrayAccessExpression.java
.../org/jetbrains/jet/lang/psi/JetArrayAccessExpression.java
+5
-40
idea/src/org/jetbrains/jet/lang/psi/JetReferenceExpression.java
...rc/org/jetbrains/jet/lang/psi/JetReferenceExpression.java
+0
-95
idea/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java
...c/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java
+5
-105
idea/src/org/jetbrains/jet/lang/psi/JetThisReferenceExpression.java
...rg/jetbrains/jet/lang/psi/JetThisReferenceExpression.java
+6
-15
idea/src/org/jetbrains/jet/plugin/references/JetArrayAccessReference.java
...brains/jet/plugin/references/JetArrayAccessReference.java
+54
-0
idea/src/org/jetbrains/jet/plugin/references/JetPsiReference.java
.../org/jetbrains/jet/plugin/references/JetPsiReference.java
+104
-0
idea/src/org/jetbrains/jet/plugin/references/JetReferenceContributor.java
...brains/jet/plugin/references/JetReferenceContributor.java
+45
-0
idea/src/org/jetbrains/jet/plugin/references/JetSimpleNameReference.java
...tbrains/jet/plugin/references/JetSimpleNameReference.java
+115
-0
idea/src/org/jetbrains/jet/plugin/references/JetThisReference.java
...org/jetbrains/jet/plugin/references/JetThisReference.java
+18
-0
未找到文件。
idea/META-INF/plugin.xml
已删除
100644 → 0
浏览文件 @
93a6f947
<idea-plugin
version=
"2"
>
<name>
Plugin name here
</name>
<description>
short description of the plugin
</description>
<version>
1.0
</version>
<vendor>
YourCompany
</vendor>
<idea-version
since-build=
"8000"
/>
<application-components>
<!-- Add your application components here -->
</application-components>
<project-components>
<!-- Add your project components here -->
</project-components>
<actions>
<!-- Add your actions here -->
</actions>
<extensions
defaultExtensionNs=
"com.intellij"
>
<!-- Add your extensions here -->
</extensions>
</idea-plugin>
\ No newline at end of file
idea/src/META-INF/plugin.xml
浏览文件 @
1af0378c
...
...
@@ -36,6 +36,7 @@
<lang.foldingBuilder
language=
"jet"
implementationClass=
"org.jetbrains.jet.plugin.JetFoldingBuilder"
/>
<lang.formatter
language=
"jet"
implementationClass=
"org.jetbrains.jet.plugin.formatter.JetFormattingModelBuilder"
/>
<lang.findUsagesProvider
language=
"jet"
implementationClass=
"org.jetbrains.jet.plugin.findUsages.JetFindUsagesProvider"
/>
<psi.referenceContributor
language=
"jet"
implementation=
"org.jetbrains.jet.plugin.references.JetReferenceContributor"
/>
<annotator
language=
"jet"
implementationClass=
"org.jetbrains.jet.plugin.annotations.SoftKeywordsAnnotator"
/>
<annotator
language=
"jet"
implementationClass=
"org.jetbrains.jet.plugin.annotations.LabelsAnnotator"
/>
<annotator
language=
"jet"
implementationClass=
"org.jetbrains.jet.plugin.annotations.JetPsiChecker"
/>
...
...
idea/src/org/jetbrains/jet/lang/psi/JetArrayAccessExpression.java
浏览文件 @
1af0378c
package
org.jetbrains.jet.lang.psi
;
import
com.intellij.lang.ASTNode
;
import
com.intellij.openapi.util.TextRange
;
import
com.intellij.psi.MultiRangeReference
;
import
com.intellij.psi.PsiElement
;
import
com.intellij.psi.PsiReference
;
import
com.intellij.psi.PsiReferenceService
;
import
com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry
;
import
com.intellij.psi.util.PsiTreeUtil
;
import
org.jetbrains.annotations.NotNull
;
import
org.jetbrains.jet.JetNodeTypes
;
import
org.jetbrains.jet.lexer.JetTokens
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.List
;
...
...
@@ -22,10 +20,10 @@ public class JetArrayAccessExpression extends JetReferenceExpression {
super
(
node
);
}
@NotNull
@Override
public
PsiReference
getReference
()
{
JetContainerNode
indicesNode
=
getIndicesNode
();
return
indicesNode
==
null
?
null
:
new
JetArrayAccessReference
();
public
PsiReference
[]
getReferences
()
{
return
ReferenceProvidersRegistry
.
getReferencesFromProviders
(
this
,
PsiReferenceService
.
Hints
.
NO_HINTS
);
}
@Override
...
...
@@ -55,37 +53,4 @@ public class JetArrayAccessExpression extends JetReferenceExpression {
public
JetContainerNode
getIndicesNode
()
{
return
(
JetContainerNode
)
findChildByType
(
JetNodeTypes
.
INDICES
);
}
private
class
JetArrayAccessReference
extends
JetPsiReference
implements
MultiRangeReference
{
@Override
public
PsiElement
getElement
()
{
return
JetArrayAccessExpression
.
this
;
}
@Override
public
TextRange
getRangeInElement
()
{
return
getElement
().
getTextRange
().
shiftRight
(-
getElement
().
getTextOffset
());
}
@Override
public
List
<
TextRange
>
getRanges
()
{
List
<
TextRange
>
list
=
new
ArrayList
<
TextRange
>();
JetContainerNode
indices
=
getIndicesNode
();
TextRange
textRange
=
indices
.
getNode
().
findChildByType
(
JetTokens
.
LBRACKET
).
getTextRange
();
TextRange
lBracketRange
=
textRange
.
shiftRight
(-
getTextOffset
());
list
.
add
(
lBracketRange
);
ASTNode
rBracket
=
indices
.
getNode
().
findChildByType
(
JetTokens
.
RBRACKET
);
if
(
rBracket
!=
null
)
{
textRange
=
rBracket
.
getTextRange
();
TextRange
rBracketRange
=
textRange
.
shiftRight
(-
getTextOffset
());
list
.
add
(
rBracketRange
);
}
return
list
;
}
}
}
idea/src/org/jetbrains/jet/lang/psi/JetReferenceExpression.java
浏览文件 @
1af0378c
package
org.jetbrains.jet.lang.psi
;
import
com.intellij.lang.ASTNode
;
import
com.intellij.psi.*
;
import
com.intellij.util.IncorrectOperationException
;
import
org.jetbrains.annotations.NotNull
;
import
org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
;
import
org.jetbrains.jet.lang.resolve.AnalyzingUtils
;
import
org.jetbrains.jet.lang.resolve.BindingContext
;
import
org.jetbrains.jet.lang.resolve.BindingContextUtils
;
import
java.util.Collection
;
import
static
org
.
jetbrains
.
jet
.
lang
.
resolve
.
BindingContext
.
AMBIGUOUS_REFERENCE_TARGET
;
import
static
org
.
jetbrains
.
jet
.
lang
.
resolve
.
BindingContext
.
DESCRIPTOR_TO_DECLARATION
;
/**
* @author abreslav
...
...
@@ -21,88 +10,4 @@ public abstract class JetReferenceExpression extends JetExpression {
public
JetReferenceExpression
(
@NotNull
ASTNode
node
)
{
super
(
node
);
}
protected
PsiElement
doResolve
()
{
JetFile
file
=
(
JetFile
)
getContainingFile
();
BindingContext
bindingContext
=
AnalyzingUtils
.
analyzeFileWithCache
(
file
);
PsiElement
psiElement
=
BindingContextUtils
.
resolveToDeclarationPsiElement
(
bindingContext
,
this
);
if
(
psiElement
!=
null
)
{
return
psiElement
;
}
Collection
<?
extends
DeclarationDescriptor
>
declarationDescriptors
=
bindingContext
.
get
(
AMBIGUOUS_REFERENCE_TARGET
,
this
);
if
(
declarationDescriptors
!=
null
)
return
null
;
return
file
;
}
protected
ResolveResult
[]
doMultiResolve
()
{
JetFile
file
=
(
JetFile
)
getContainingFile
();
BindingContext
bindingContext
=
AnalyzingUtils
.
analyzeFileWithCache
(
file
);
Collection
<?
extends
DeclarationDescriptor
>
declarationDescriptors
=
bindingContext
.
get
(
AMBIGUOUS_REFERENCE_TARGET
,
this
);
assert
declarationDescriptors
!=
null
;
ResolveResult
[]
results
=
new
ResolveResult
[
declarationDescriptors
.
size
()];
int
i
=
0
;
for
(
DeclarationDescriptor
descriptor
:
declarationDescriptors
)
{
PsiElement
element
=
bindingContext
.
get
(
DESCRIPTOR_TO_DECLARATION
,
descriptor
);
if
(
element
!=
null
)
{
results
[
i
]
=
new
PsiElementResolveResult
(
element
,
true
);
i
++;
}
}
return
results
;
}
@Override
public
abstract
PsiReference
getReference
();
protected
abstract
class
JetPsiReference
implements
PsiPolyVariantReference
{
@NotNull
@Override
public
ResolveResult
[]
multiResolve
(
boolean
incompleteCode
)
{
return
doMultiResolve
();
}
@Override
public
PsiElement
resolve
()
{
return
doResolve
();
}
@NotNull
@Override
public
String
getCanonicalText
()
{
return
"<TBD>"
;
}
@Override
public
PsiElement
handleElementRename
(
String
newElementName
)
throws
IncorrectOperationException
{
throw
new
IncorrectOperationException
();
}
@Override
public
PsiElement
bindToElement
(
@NotNull
PsiElement
element
)
throws
IncorrectOperationException
{
throw
new
IncorrectOperationException
();
}
@Override
public
boolean
isReferenceTo
(
PsiElement
element
)
{
return
resolve
()
==
element
;
}
@NotNull
@Override
public
Object
[]
getVariants
()
{
return
EMPTY_ARRAY
;
}
@Override
public
boolean
isSoft
()
{
return
false
;
}
}
// protected abstract class JetPsiMultiReference extends JetPsiReference implements PsiPolyVariantReference {
// @NotNull
// @Override
// public abstract ResolveResult[] multiResolve(boolean incompleteCode);
// }
}
idea/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java
浏览文件 @
1af0378c
package
org.jetbrains.jet.lang.psi
;
import
com.google.common.collect.Lists
;
import
com.intellij.codeInsight.lookup.LookupElement
;
import
com.intellij.codeInsight.lookup.LookupElementBuilder
;
import
com.intellij.lang.ASTNode
;
import
com.intellij.openapi.util.TextRange
;
import
com.intellij.openapi.util.text.StringUtil
;
import
com.intellij.psi.PsiElement
;
import
com.intellij.psi.PsiReference
;
import
com.intellij.psi.PsiReferenceService
;
import
com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry
;
import
com.intellij.psi.tree.IElementType
;
import
com.intellij.psi.tree.TokenSet
;
import
com.intellij.util.Function
;
import
com.intellij.util.IncorrectOperationException
;
import
org.jetbrains.annotations.NotNull
;
import
org.jetbrains.annotations.Nullable
;
import
org.jetbrains.jet.lang.descriptors.*
;
import
org.jetbrains.jet.lang.parsing.JetExpressionParsing
;
import
org.jetbrains.jet.lang.resolve.AnalyzingUtils
;
import
org.jetbrains.jet.lang.resolve.BindingContext
;
import
org.jetbrains.jet.lang.resolve.JetScope
;
import
org.jetbrains.jet.lang.types.JetType
;
import
org.jetbrains.jet.lexer.JetTokens
;
import
org.jetbrains.jet.resolve.DescriptorRenderer
;
import
java.util.List
;
/**
* @author max
...
...
@@ -63,97 +50,10 @@ public class JetSimpleNameExpression extends JetReferenceExpression {
return
element
==
null
?
null
:
element
.
getNode
().
getElementType
();
}
@NotNull
@Override
public
PsiReference
findReferenceAt
(
int
offset
)
{
return
getReference
();
}
@Override
public
PsiReference
getReference
()
{
return
new
JetPsiReference
()
{
@Override
public
PsiElement
getElement
()
{
return
getReferencedNameElement
();
}
@Override
public
TextRange
getRangeInElement
()
{
return
new
TextRange
(
0
,
getElement
().
getTextLength
());
}
@NotNull
@Override
public
Object
[]
getVariants
()
{
PsiElement
parent
=
getParent
();
if
(
parent
instanceof
JetQualifiedExpression
)
{
JetQualifiedExpression
qualifiedExpression
=
(
JetQualifiedExpression
)
parent
;
JetExpression
receiverExpression
=
qualifiedExpression
.
getReceiverExpression
();
JetFile
file
=
(
JetFile
)
getContainingFile
();
BindingContext
bindingContext
=
AnalyzingUtils
.
analyzeFileWithCache
(
file
);
final
JetType
expressionType
=
bindingContext
.
get
(
BindingContext
.
EXPRESSION_TYPE
,
receiverExpression
);
if
(
expressionType
!=
null
)
{
return
collectLookupElements
(
bindingContext
,
expressionType
.
getMemberScope
());
}
}
else
{
JetFile
file
=
(
JetFile
)
getContainingFile
();
BindingContext
bindingContext
=
AnalyzingUtils
.
analyzeFileWithCache
(
file
);
JetScope
resolutionScope
=
bindingContext
.
get
(
BindingContext
.
RESOLUTION_SCOPE
,
JetSimpleNameExpression
.
this
);
if
(
resolutionScope
!=
null
)
{
return
collectLookupElements
(
bindingContext
,
resolutionScope
);
}
}
return
EMPTY_ARRAY
;
}
@Override
public
PsiElement
handleElementRename
(
String
newElementName
)
throws
IncorrectOperationException
{
PsiElement
element
=
JetChangeUtil
.
createNameIdentifier
(
getProject
(),
newElementName
);
return
getReferencedNameElement
().
replace
(
element
);
}
};
}
private
Object
[]
collectLookupElements
(
BindingContext
bindingContext
,
JetScope
scope
)
{
List
<
LookupElement
>
result
=
Lists
.
newArrayList
();
for
(
final
DeclarationDescriptor
descriptor
:
scope
.
getAllDescriptors
())
{
PsiElement
declaration
=
bindingContext
.
get
(
BindingContext
.
DESCRIPTOR_TO_DECLARATION
,
descriptor
.
getOriginal
());
LookupElementBuilder
element
=
LookupElementBuilder
.
create
(
descriptor
.
getName
());
String
typeText
=
""
;
String
tailText
=
""
;
boolean
tailTextGrayed
=
false
;
if
(
descriptor
instanceof
FunctionDescriptor
)
{
FunctionDescriptor
functionDescriptor
=
(
FunctionDescriptor
)
descriptor
;
JetType
returnType
=
functionDescriptor
.
getReturnType
();
typeText
=
DescriptorRenderer
.
TEXT
.
renderType
(
returnType
);
tailText
=
"("
+
StringUtil
.
join
(
functionDescriptor
.
getValueParameters
(),
new
Function
<
ValueParameterDescriptor
,
String
>()
{
@Override
public
String
fun
(
ValueParameterDescriptor
valueParameterDescriptor
)
{
return
valueParameterDescriptor
.
getName
()
+
":"
+
DescriptorRenderer
.
TEXT
.
renderType
(
valueParameterDescriptor
.
getOutType
());
}
},
","
)
+
")"
;
}
else
if
(
descriptor
instanceof
VariableDescriptor
)
{
JetType
outType
=
((
VariableDescriptor
)
descriptor
).
getOutType
();
typeText
=
DescriptorRenderer
.
TEXT
.
renderType
(
outType
);
}
else
if
(
descriptor
instanceof
ClassDescriptor
)
{
tailText
=
" ("
+
DescriptorRenderer
.
getFQName
(
descriptor
.
getContainingDeclaration
())
+
")"
;
tailTextGrayed
=
true
;
}
else
{
typeText
=
DescriptorRenderer
.
TEXT
.
render
(
descriptor
);
}
element
=
element
.
setTailText
(
tailText
,
tailTextGrayed
).
setTypeText
(
typeText
);
if
(
declaration
!=
null
)
{
element
=
element
.
setIcon
(
declaration
.
getIcon
(
ICON_FLAG_OPEN
|
ICON_FLAG_VISIBILITY
));
}
result
.
add
(
element
);
}
return
result
.
toArray
();
public
PsiReference
[]
getReferences
()
{
return
ReferenceProvidersRegistry
.
getReferencesFromProviders
(
this
,
PsiReferenceService
.
Hints
.
NO_HINTS
);
}
@Override
...
...
idea/src/org/jetbrains/jet/lang/psi/JetThisReferenceExpression.java
浏览文件 @
1af0378c
package
org.jetbrains.jet.lang.psi
;
import
com.intellij.lang.ASTNode
;
import
com.intellij.openapi.util.TextRange
;
import
com.intellij.psi.PsiElement
;
import
com.intellij.psi.PsiReference
;
import
com.intellij.psi.PsiReferenceService
;
import
com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry
;
import
org.jetbrains.annotations.NotNull
;
/**
...
...
@@ -14,19 +14,10 @@ public class JetThisReferenceExpression extends JetReferenceExpression {
super
(
node
);
}
@NotNull
@Override
public
PsiReference
getReference
()
{
return
new
JetPsiReference
()
{
@Override
public
PsiElement
getElement
()
{
return
JetThisReferenceExpression
.
this
;
}
@Override
public
TextRange
getRangeInElement
()
{
return
new
TextRange
(
0
,
getElement
().
getTextLength
());
}
};
public
PsiReference
[]
getReferences
()
{
return
ReferenceProvidersRegistry
.
getReferencesFromProviders
(
this
,
PsiReferenceService
.
Hints
.
NO_HINTS
);
}
}
idea/src/org/jetbrains/jet/plugin/references/JetArrayAccessReference.java
0 → 100644
浏览文件 @
1af0378c
package
org.jetbrains.jet.plugin.references
;
import
com.intellij.lang.ASTNode
;
import
com.intellij.openapi.util.TextRange
;
import
com.intellij.psi.MultiRangeReference
;
import
com.intellij.psi.PsiReference
;
import
org.jetbrains.jet.lang.psi.JetArrayAccessExpression
;
import
org.jetbrains.jet.lang.psi.JetContainerNode
;
import
org.jetbrains.jet.lexer.JetTokens
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* @author yole
*/
class
JetArrayAccessReference
extends
JetPsiReference
implements
MultiRangeReference
{
private
JetArrayAccessExpression
expression
;
public
static
PsiReference
[]
create
(
JetArrayAccessExpression
expression
)
{
JetContainerNode
indicesNode
=
expression
.
getIndicesNode
();
return
indicesNode
==
null
?
PsiReference
.
EMPTY_ARRAY
:
new
PsiReference
[]
{
new
JetArrayAccessReference
(
expression
)
};
}
public
JetArrayAccessReference
(
JetArrayAccessExpression
expression
)
{
super
(
expression
);
this
.
expression
=
expression
;
}
@Override
public
TextRange
getRangeInElement
()
{
return
getElement
().
getTextRange
().
shiftRight
(-
getElement
().
getTextOffset
());
}
@Override
public
List
<
TextRange
>
getRanges
()
{
List
<
TextRange
>
list
=
new
ArrayList
<
TextRange
>();
JetContainerNode
indices
=
expression
.
getIndicesNode
();
TextRange
textRange
=
indices
.
getNode
().
findChildByType
(
JetTokens
.
LBRACKET
).
getTextRange
();
TextRange
lBracketRange
=
textRange
.
shiftRight
(-
expression
.
getTextOffset
());
list
.
add
(
lBracketRange
);
ASTNode
rBracket
=
indices
.
getNode
().
findChildByType
(
JetTokens
.
RBRACKET
);
if
(
rBracket
!=
null
)
{
textRange
=
rBracket
.
getTextRange
();
TextRange
rBracketRange
=
textRange
.
shiftRight
(-
expression
.
getTextOffset
());
list
.
add
(
rBracketRange
);
}
return
list
;
}
}
idea/src/org/jetbrains/jet/plugin/references/JetPsiReference.java
0 → 100644
浏览文件 @
1af0378c
package
org.jetbrains.jet.plugin.references
;
import
com.intellij.psi.PsiElement
;
import
com.intellij.psi.PsiElementResolveResult
;
import
com.intellij.psi.PsiPolyVariantReference
;
import
com.intellij.psi.ResolveResult
;
import
com.intellij.util.IncorrectOperationException
;
import
org.jetbrains.annotations.NotNull
;
import
org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
;
import
org.jetbrains.jet.lang.psi.JetFile
;
import
org.jetbrains.jet.lang.psi.JetReferenceExpression
;
import
org.jetbrains.jet.lang.resolve.AnalyzingUtils
;
import
org.jetbrains.jet.lang.resolve.BindingContext
;
import
org.jetbrains.jet.lang.resolve.BindingContextUtils
;
import
java.util.Collection
;
import
static
org
.
jetbrains
.
jet
.
lang
.
resolve
.
BindingContext
.
AMBIGUOUS_REFERENCE_TARGET
;
import
static
org
.
jetbrains
.
jet
.
lang
.
resolve
.
BindingContext
.
DESCRIPTOR_TO_DECLARATION
;
public
abstract
class
JetPsiReference
implements
PsiPolyVariantReference
{
protected
final
JetReferenceExpression
myExpression
;
protected
JetPsiReference
(
JetReferenceExpression
expression
)
{
this
.
myExpression
=
expression
;
}
@Override
public
PsiElement
getElement
()
{
return
myExpression
;
}
@NotNull
@Override
public
ResolveResult
[]
multiResolve
(
boolean
incompleteCode
)
{
return
doMultiResolve
();
}
@Override
public
PsiElement
resolve
()
{
return
doResolve
();
}
@NotNull
@Override
public
String
getCanonicalText
()
{
return
"<TBD>"
;
}
@Override
public
PsiElement
handleElementRename
(
String
newElementName
)
throws
IncorrectOperationException
{
throw
new
IncorrectOperationException
();
}
@Override
public
PsiElement
bindToElement
(
@NotNull
PsiElement
element
)
throws
IncorrectOperationException
{
throw
new
IncorrectOperationException
();
}
@Override
public
boolean
isReferenceTo
(
PsiElement
element
)
{
return
resolve
()
==
element
;
}
@NotNull
@Override
public
Object
[]
getVariants
()
{
return
EMPTY_ARRAY
;
}
@Override
public
boolean
isSoft
()
{
return
false
;
}
protected
PsiElement
doResolve
()
{
JetFile
file
=
(
JetFile
)
getElement
().
getContainingFile
();
BindingContext
bindingContext
=
AnalyzingUtils
.
analyzeFileWithCache
(
file
);
PsiElement
psiElement
=
BindingContextUtils
.
resolveToDeclarationPsiElement
(
bindingContext
,
myExpression
);
if
(
psiElement
!=
null
)
{
return
psiElement
;
}
Collection
<?
extends
DeclarationDescriptor
>
declarationDescriptors
=
bindingContext
.
get
(
AMBIGUOUS_REFERENCE_TARGET
,
myExpression
);
if
(
declarationDescriptors
!=
null
)
return
null
;
return
file
;
}
protected
ResolveResult
[]
doMultiResolve
()
{
JetFile
file
=
(
JetFile
)
getElement
().
getContainingFile
();
BindingContext
bindingContext
=
AnalyzingUtils
.
analyzeFileWithCache
(
file
);
Collection
<?
extends
DeclarationDescriptor
>
declarationDescriptors
=
bindingContext
.
get
(
AMBIGUOUS_REFERENCE_TARGET
,
myExpression
);
assert
declarationDescriptors
!=
null
;
ResolveResult
[]
results
=
new
ResolveResult
[
declarationDescriptors
.
size
()];
int
i
=
0
;
for
(
DeclarationDescriptor
descriptor
:
declarationDescriptors
)
{
PsiElement
element
=
bindingContext
.
get
(
DESCRIPTOR_TO_DECLARATION
,
descriptor
);
if
(
element
!=
null
)
{
results
[
i
]
=
new
PsiElementResolveResult
(
element
,
true
);
i
++;
}
}
return
results
;
}
}
idea/src/org/jetbrains/jet/plugin/references/JetReferenceContributor.java
0 → 100644
浏览文件 @
1af0378c
package
org.jetbrains.jet.plugin.references
;
import
com.intellij.psi.*
;
import
com.intellij.util.ProcessingContext
;
import
org.jetbrains.annotations.NotNull
;
import
org.jetbrains.jet.lang.psi.JetArrayAccessExpression
;
import
org.jetbrains.jet.lang.psi.JetSimpleNameExpression
;
import
org.jetbrains.jet.lang.psi.JetThisReferenceExpression
;
import
static
com
.
intellij
.
patterns
.
PlatformPatterns
.
psiElement
;
/**
* @author yole
*/
public
class
JetReferenceContributor
extends
PsiReferenceContributor
{
@Override
public
void
registerReferenceProviders
(
PsiReferenceRegistrar
registrar
)
{
registrar
.
registerReferenceProvider
(
psiElement
(
JetSimpleNameExpression
.
class
),
new
PsiReferenceProvider
()
{
@NotNull
@Override
public
PsiReference
[]
getReferencesByElement
(
@NotNull
PsiElement
element
,
@NotNull
ProcessingContext
processingContext
)
{
return
new
PsiReference
[]
{
new
JetSimpleNameReference
((
JetSimpleNameExpression
)
element
)
};
}
});
registrar
.
registerReferenceProvider
(
psiElement
(
JetThisReferenceExpression
.
class
),
new
PsiReferenceProvider
()
{
@NotNull
@Override
public
PsiReference
[]
getReferencesByElement
(
@NotNull
PsiElement
element
,
@NotNull
ProcessingContext
processingContext
)
{
return
new
PsiReference
[]
{
new
JetThisReference
((
JetThisReferenceExpression
)
element
)
};
}
});
registrar
.
registerReferenceProvider
(
psiElement
(
JetArrayAccessExpression
.
class
),
new
PsiReferenceProvider
()
{
@NotNull
@Override
public
PsiReference
[]
getReferencesByElement
(
@NotNull
PsiElement
element
,
@NotNull
ProcessingContext
processingContext
)
{
return
JetArrayAccessReference
.
create
((
JetArrayAccessExpression
)
element
);
}
});
}
}
idea/src/org/jetbrains/jet/plugin/references/JetSimpleNameReference.java
0 → 100644
浏览文件 @
1af0378c
package
org.jetbrains.jet.plugin.references
;
import
com.google.common.collect.Lists
;
import
com.intellij.codeInsight.lookup.LookupElement
;
import
com.intellij.codeInsight.lookup.LookupElementBuilder
;
import
com.intellij.openapi.util.Iconable
;
import
com.intellij.openapi.util.TextRange
;
import
com.intellij.openapi.util.text.StringUtil
;
import
com.intellij.psi.PsiElement
;
import
com.intellij.util.Function
;
import
com.intellij.util.IncorrectOperationException
;
import
org.jetbrains.annotations.NotNull
;
import
org.jetbrains.jet.lang.descriptors.*
;
import
org.jetbrains.jet.lang.psi.*
;
import
org.jetbrains.jet.lang.resolve.AnalyzingUtils
;
import
org.jetbrains.jet.lang.resolve.BindingContext
;
import
org.jetbrains.jet.lang.resolve.JetScope
;
import
org.jetbrains.jet.lang.types.JetType
;
import
org.jetbrains.jet.resolve.DescriptorRenderer
;
import
java.util.List
;
/**
* @author yole
*/
class
JetSimpleNameReference
extends
JetPsiReference
{
private
final
JetSimpleNameExpression
myExpression
;
public
JetSimpleNameReference
(
JetSimpleNameExpression
jetSimpleNameExpression
)
{
super
(
jetSimpleNameExpression
);
myExpression
=
jetSimpleNameExpression
;
}
@Override
public
PsiElement
getElement
()
{
return
myExpression
.
getReferencedNameElement
();
}
@Override
public
TextRange
getRangeInElement
()
{
return
new
TextRange
(
0
,
getElement
().
getTextLength
());
}
@NotNull
@Override
public
Object
[]
getVariants
()
{
PsiElement
parent
=
myExpression
.
getParent
();
if
(
parent
instanceof
JetQualifiedExpression
)
{
JetQualifiedExpression
qualifiedExpression
=
(
JetQualifiedExpression
)
parent
;
JetExpression
receiverExpression
=
qualifiedExpression
.
getReceiverExpression
();
JetFile
file
=
(
JetFile
)
myExpression
.
getContainingFile
();
BindingContext
bindingContext
=
AnalyzingUtils
.
analyzeFileWithCache
(
file
);
final
JetType
expressionType
=
bindingContext
.
get
(
BindingContext
.
EXPRESSION_TYPE
,
receiverExpression
);
if
(
expressionType
!=
null
)
{
return
collectLookupElements
(
bindingContext
,
expressionType
.
getMemberScope
());
}
}
else
{
JetFile
file
=
(
JetFile
)
myExpression
.
getContainingFile
();
BindingContext
bindingContext
=
AnalyzingUtils
.
analyzeFileWithCache
(
file
);
JetScope
resolutionScope
=
bindingContext
.
get
(
BindingContext
.
RESOLUTION_SCOPE
,
myExpression
);
if
(
resolutionScope
!=
null
)
{
return
collectLookupElements
(
bindingContext
,
resolutionScope
);
}
}
return
EMPTY_ARRAY
;
}
@Override
public
PsiElement
handleElementRename
(
String
newElementName
)
throws
IncorrectOperationException
{
PsiElement
element
=
JetChangeUtil
.
createNameIdentifier
(
myExpression
.
getProject
(),
newElementName
);
return
myExpression
.
getReferencedNameElement
().
replace
(
element
);
}
private
Object
[]
collectLookupElements
(
BindingContext
bindingContext
,
JetScope
scope
)
{
List
<
LookupElement
>
result
=
Lists
.
newArrayList
();
for
(
final
DeclarationDescriptor
descriptor
:
scope
.
getAllDescriptors
())
{
PsiElement
declaration
=
bindingContext
.
get
(
BindingContext
.
DESCRIPTOR_TO_DECLARATION
,
descriptor
.
getOriginal
());
LookupElementBuilder
element
=
LookupElementBuilder
.
create
(
descriptor
.
getName
());
String
typeText
=
""
;
String
tailText
=
""
;
boolean
tailTextGrayed
=
false
;
if
(
descriptor
instanceof
FunctionDescriptor
)
{
FunctionDescriptor
functionDescriptor
=
(
FunctionDescriptor
)
descriptor
;
JetType
returnType
=
functionDescriptor
.
getReturnType
();
typeText
=
DescriptorRenderer
.
TEXT
.
renderType
(
returnType
);
tailText
=
"("
+
StringUtil
.
join
(
functionDescriptor
.
getValueParameters
(),
new
Function
<
ValueParameterDescriptor
,
String
>()
{
@Override
public
String
fun
(
ValueParameterDescriptor
valueParameterDescriptor
)
{
return
valueParameterDescriptor
.
getName
()
+
":"
+
DescriptorRenderer
.
TEXT
.
renderType
(
valueParameterDescriptor
.
getOutType
());
}
},
","
)
+
")"
;
}
else
if
(
descriptor
instanceof
VariableDescriptor
)
{
JetType
outType
=
((
VariableDescriptor
)
descriptor
).
getOutType
();
typeText
=
DescriptorRenderer
.
TEXT
.
renderType
(
outType
);
}
else
if
(
descriptor
instanceof
ClassDescriptor
)
{
tailText
=
" ("
+
DescriptorRenderer
.
getFQName
(
descriptor
.
getContainingDeclaration
())
+
")"
;
tailTextGrayed
=
true
;
}
else
{
typeText
=
DescriptorRenderer
.
TEXT
.
render
(
descriptor
);
}
element
=
element
.
setTailText
(
tailText
,
tailTextGrayed
).
setTypeText
(
typeText
);
if
(
declaration
!=
null
)
{
element
=
element
.
setIcon
(
declaration
.
getIcon
(
Iconable
.
ICON_FLAG_OPEN
|
Iconable
.
ICON_FLAG_VISIBILITY
));
}
result
.
add
(
element
);
}
return
result
.
toArray
();
}
}
idea/src/org/jetbrains/jet/plugin/references/JetThisReference.java
0 → 100644
浏览文件 @
1af0378c
package
org.jetbrains.jet.plugin.references
;
import
com.intellij.openapi.util.TextRange
;
import
org.jetbrains.jet.lang.psi.JetThisReferenceExpression
;
/**
* @author yole
*/
public
class
JetThisReference
extends
JetPsiReference
{
public
JetThisReference
(
JetThisReferenceExpression
expression
)
{
super
(
expression
);
}
@Override
public
TextRange
getRangeInElement
()
{
return
new
TextRange
(
0
,
getElement
().
getTextLength
());
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录