Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
硅谷海盗
kotlin
提交
a31027d2
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,发现更多精彩内容 >>
提交
a31027d2
编写于
1月 31, 2012
作者:
A
Andrey Breslav
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Very basic stub implementation for annotation arguments
上级
379e066d
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
91 addition
and
53 deletion
+91
-53
compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationResolver.java
...rc/org/jetbrains/jet/lang/resolve/AnnotationResolver.java
+91
-53
未找到文件。
compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationResolver.java
浏览文件 @
a31027d2
...
...
@@ -5,22 +5,24 @@ import org.jetbrains.annotations.NotNull;
import
org.jetbrains.annotations.Nullable
;
import
org.jetbrains.jet.lang.JetSemanticServices
;
import
org.jetbrains.jet.lang.descriptors.FunctionDescriptor
;
import
org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor
;
import
org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor
;
import
org.jetbrains.jet.lang.psi.JetAnnotationEntry
;
import
org.jetbrains.jet.lang.psi.JetExpression
;
import
org.jetbrains.jet.lang.psi.JetModifierList
;
import
org.jetbrains.jet.lang.psi.*
;
import
org.jetbrains.jet.lang.resolve.calls.CallMaker
;
import
org.jetbrains.jet.lang.resolve.calls.CallResolver
;
import
org.jetbrains.jet.lang.resolve.calls.OverloadResolutionResults
;
import
org.jetbrains.jet.lang.resolve.calls.ResolvedValueArgument
;
import
org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo
;
import
org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant
;
import
org.jetbrains.jet.lang.resolve.scopes.JetScope
;
import
org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor
;
import
org.jetbrains.jet.lang.types.ErrorUtils
;
import
org.jetbrains.jet.lang.types.JetType
;
import
org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices
;
import
java.util.Collections
;
import
java.util.List
;
import
java.util.Map
;
import
static
org
.
jetbrains
.
jet
.
lang
.
types
.
TypeUtils
.
NO_EXPECTED_TYPE
;
...
...
@@ -30,15 +32,21 @@ import static org.jetbrains.jet.lang.types.TypeUtils.NO_EXPECTED_TYPE;
public
class
AnnotationResolver
{
private
final
BindingTrace
trace
;
// private final JetTypeInferrer typeInferrer
;
private
final
JetSemanticServices
semanticServices
;
private
final
CallResolver
callResolver
;
// private final JetTypeInferrer.Services services;
public
AnnotationResolver
(
JetSemanticServices
semanticServices
,
BindingTrace
trace
)
{
this
.
trace
=
trace
;
// this.typeInferrer = new JetTypeInferrer(JetFlowInformationProvider.THROW_EXCEPTION, semanticServices);
// this.services = typeInferrer.getServices(this.trace);
this
.
callResolver
=
new
CallResolver
(
semanticServices
,
DataFlowInfo
.
EMPTY
);
this
.
semanticServices
=
semanticServices
;
}
@NotNull
public
List
<
AnnotationDescriptor
>
resolveAnnotations
(
@NotNull
JetScope
scope
,
@Nullable
JetModifierList
modifierList
)
{
if
(
modifierList
==
null
)
{
return
Collections
.
emptyList
();
}
return
resolveAnnotations
(
scope
,
modifierList
.
getAnnotationEntries
());
}
@NotNull
...
...
@@ -53,57 +61,95 @@ public class AnnotationResolver {
return
result
;
}
public
void
resolveAnnotationStub
(
@NotNull
JetScope
scope
,
@NotNull
JetAnnotationEntry
entryElement
,
@NotNull
AnnotationDescriptor
descriptor
)
{
public
void
resolveAnnotationStub
(
@NotNull
JetScope
scope
,
@NotNull
JetAnnotationEntry
entryElement
,
@NotNull
AnnotationDescriptor
descriptor
)
{
OverloadResolutionResults
<
FunctionDescriptor
>
results
=
resolveType
(
scope
,
entryElement
,
descriptor
);
resolveArguments
(
results
,
descriptor
);
}
@NotNull
private
OverloadResolutionResults
<
FunctionDescriptor
>
resolveType
(
@NotNull
JetScope
scope
,
@NotNull
JetAnnotationEntry
entryElement
,
@NotNull
AnnotationDescriptor
descriptor
)
{
OverloadResolutionResults
<
FunctionDescriptor
>
results
=
callResolver
.
resolveCall
(
trace
,
scope
,
CallMaker
.
makeCall
(
ReceiverDescriptor
.
NO_RECEIVER
,
null
,
entryElement
),
NO_EXPECTED_TYPE
);
JetType
annotationType
=
results
.
getResultingDescriptor
().
getReturnType
();
if
(
results
.
isSuccess
())
{
descriptor
.
setAnnotationType
(
results
.
getResultingDescriptor
().
getReturnType
());
}
else
{
descriptor
.
setAnnotationType
(
annotationType
);
}
else
{
descriptor
.
setAnnotationType
(
ErrorUtils
.
createErrorType
(
"Unresolved annotation type"
));
}
return
results
;
}
@NotNull
public
List
<
AnnotationDescriptor
>
resolveAnnotations
(
@NotNull
JetScope
scope
,
@Nullable
JetModifierList
modifierList
)
{
if
(
modifierList
==
null
)
{
return
Collections
.
emptyList
();
private
void
resolveArguments
(
@NotNull
OverloadResolutionResults
<
FunctionDescriptor
>
results
,
@NotNull
AnnotationDescriptor
descriptor
)
{
List
<
CompileTimeConstant
<?>>
arguments
=
Lists
.
newArrayList
();
for
(
Map
.
Entry
<
ValueParameterDescriptor
,
ResolvedValueArgument
>
descriptorToArgument
:
results
.
getResultingCall
().
getValueArguments
().
entrySet
())
{
// TODO: are varargs supported here?
List
<
JetExpression
>
argumentExpressions
=
descriptorToArgument
.
getValue
().
getArgumentExpressions
();
ValueParameterDescriptor
parameterDescriptor
=
descriptorToArgument
.
getKey
();
for
(
JetExpression
argument
:
argumentExpressions
)
{
arguments
.
add
(
resolveAnnotationArgument
(
argument
,
parameterDescriptor
.
getOutType
()));
}
}
return
resolveAnnotations
(
scope
,
modifierList
.
getAnnotationEntries
()
);
descriptor
.
setValueArguments
(
arguments
);
}
public
CompileTimeConstant
<?>
resolveAnnotationArgument
(
@NotNull
JetExpression
expression
,
@NotNull
JetType
expectedType
)
{
final
CompileTimeConstant
<?>[]
result
=
new
CompileTimeConstant
<?>[
1
];
// expression.accept(new JetVisitorVoid() {
// @Override
// public void visitConstantExpression(JetConstantExpression expression) {
// JetType type = typeInferrer.getType(JetScope.EMPTY, expression, false, expectedType);
// if (type != null) {
// Object value = expression.getValue();
//
// }
// }
//
// @Override
// public void visitAnnotation(JetAnnotation annotation) {
// super.visitAnnotation(annotation); // TODO
// }
//
// @Override
// public void visitAnnotationEntry(JetAnnotationEntry annotationEntry) {
// super.visitAnnotationEntry(annotationEntry); // TODO
// }
//
// @Override
// public void visitParenthesizedExpression(JetParenthesizedExpression expression) {
// expression.getExpression().accept(this);
@Nullable
public
CompileTimeConstant
<?>
resolveAnnotationArgument
(
@NotNull
JetExpression
expression
,
@NotNull
final
JetType
expectedType
)
{
JetVisitor
<
CompileTimeConstant
<?>,
Void
>
visitor
=
new
JetVisitor
<
CompileTimeConstant
<?>,
Void
>()
{
@Override
public
CompileTimeConstant
<?>
visitConstantExpression
(
JetConstantExpression
expression
,
Void
nothing
)
{
ExpressionTypingServices
typeInferrerServices
=
semanticServices
.
getTypeInferrerServices
(
trace
);
JetType
type
=
typeInferrerServices
.
getType
(
JetScope
.
EMPTY
,
expression
,
expectedType
,
DataFlowInfo
.
EMPTY
);
if
(
type
==
null
)
{
// TODO:
// trace.report(ANNOTATION_PARAMETER_SHOULD_BE_CONSTANT.on(expression));
}
return
trace
.
get
(
BindingContext
.
COMPILE_TIME_VALUE
,
expression
);
}
// @Override
// public CompileTimeConstant visitAnnotation(JetAnnotation annotation, Void nothing) {
// super.visitAnnotation(annotation, null); // TODO
// }
//
// @Override
// public
void visitJetElement(JetElement element
) {
//
trace.getErrorHandler().genericError(element.getNode(), "Not allowed as an annotation argument");
// public
CompileTimeConstant visitAnnotationEntry(JetAnnotationEntry annotationEntry, Void nothing
) {
//
return super.visitAnnotationEntry(annotationEntry, null); // TODO
// }
// });
return
result
[
0
];
@Override
public
CompileTimeConstant
<?>
visitParenthesizedExpression
(
JetParenthesizedExpression
expression
,
Void
nothing
)
{
JetExpression
innerExpression
=
expression
.
getExpression
();
if
(
innerExpression
==
null
)
return
null
;
return
innerExpression
.
accept
(
this
,
null
);
}
@Override
public
CompileTimeConstant
<?>
visitStringTemplateExpression
(
JetStringTemplateExpression
expression
,
Void
nothing
)
{
return
trace
.
get
(
BindingContext
.
COMPILE_TIME_VALUE
,
expression
);
}
@Override
public
CompileTimeConstant
<?>
visitJetElement
(
JetElement
element
,
Void
nothing
)
{
// TODO:
//trace.report(ANNOTATION_PARAMETER_SHOULD_BE_CONSTANT.on(element));
return
null
;
}
};
return
expression
.
accept
(
visitor
,
null
);
}
@NotNull
public
List
<
AnnotationDescriptor
>
createAnnotationStubs
(
@Nullable
JetModifierList
modifierList
)
{
if
(
modifierList
==
null
)
{
return
Collections
.
emptyList
();
}
return
createAnnotationStubs
(
modifierList
.
getAnnotationEntries
());
}
@NotNull
...
...
@@ -116,12 +162,4 @@ public class AnnotationResolver {
}
return
result
;
}
@NotNull
public
List
<
AnnotationDescriptor
>
createAnnotationStubs
(
@Nullable
JetModifierList
modifierList
)
{
if
(
modifierList
==
null
)
{
return
Collections
.
emptyList
();
}
return
createAnnotationStubs
(
modifierList
.
getAnnotationEntries
());
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录