Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
硅谷海盗
kotlin
提交
85f46abc
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,发现更多精彩内容 >>
提交
85f46abc
编写于
4月 21, 2011
作者:
D
Dmitry Jemerov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
handle getters/setters without body; generate initializers for class-level properties
上级
9e33922b
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
71 addition
and
19 deletion
+71
-19
idea/src/org/jetbrains/jet/codegen/ClassCodegen.java
idea/src/org/jetbrains/jet/codegen/ClassCodegen.java
+30
-0
idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
+1
-1
idea/src/org/jetbrains/jet/codegen/PropertyCodegen.java
idea/src/org/jetbrains/jet/codegen/PropertyCodegen.java
+23
-16
idea/tests/org/jetbrains/jet/codegen/CodegenTestCase.java
idea/tests/org/jetbrains/jet/codegen/CodegenTestCase.java
+8
-2
idea/tests/org/jetbrains/jet/codegen/PropertyGenTest.java
idea/tests/org/jetbrains/jet/codegen/PropertyGenTest.java
+9
-0
未找到文件。
idea/src/org/jetbrains/jet/codegen/ClassCodegen.java
浏览文件 @
85f46abc
...
...
@@ -8,6 +8,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
import
org.jetbrains.jet.lang.types.ClassDescriptor
;
import
org.jetbrains.jet.lang.types.JetStandardLibrary
;
import
org.jetbrains.jet.lang.types.JetType
;
import
org.jetbrains.jet.lang.types.PropertyDescriptor
;
import
org.objectweb.asm.ClassVisitor
;
import
org.objectweb.asm.MethodVisitor
;
import
org.objectweb.asm.Opcodes
;
...
...
@@ -161,15 +162,44 @@ public class ClassCodegen {
Method
method
=
new
Method
(
"<init>"
,
Type
.
VOID_TYPE
,
new
Type
[
0
]);
final
MethodVisitor
mv
=
v
.
visitMethod
(
flags
,
"<init>"
,
method
.
getDescriptor
(),
null
,
null
);
mv
.
visitCode
();
FrameMap
frameMap
=
new
FrameMap
();
frameMap
.
enterTemp
();
// this
final
InstructionAdapter
iv
=
new
InstructionAdapter
(
mv
);
String
superClass
=
getSuperClass
(
aClass
,
kind
);
iv
.
load
(
0
,
Type
.
getType
(
"L"
+
superClass
+
";"
));
iv
.
invokespecial
(
superClass
,
"<init>"
,
method
.
getDescriptor
());
final
JetStandardLibrary
standardLibrary
=
JetStandardLibrary
.
getJetStandardLibrary
(
project
);
final
JetTypeMapper
typeMapper
=
new
JetTypeMapper
(
standardLibrary
,
bindingContext
);
ExpressionCodegen
codegen
=
new
ExpressionCodegen
(
mv
,
bindingContext
,
frameMap
,
typeMapper
,
Type
.
VOID_TYPE
);
generateInitializers
(
aClass
,
kind
,
codegen
,
iv
,
typeMapper
);
iv
.
visitInsn
(
Opcodes
.
RETURN
);
mv
.
visitMaxs
(
0
,
0
);
mv
.
visitEnd
();
}
private
void
generateInitializers
(
JetClass
aClass
,
OwnerKind
kind
,
ExpressionCodegen
codegen
,
InstructionAdapter
iv
,
JetTypeMapper
typeMapper
)
{
for
(
JetDeclaration
declaration
:
aClass
.
getDeclarations
())
{
if
(
declaration
instanceof
JetProperty
)
{
final
PropertyDescriptor
propertyDescriptor
=
(
PropertyDescriptor
)
bindingContext
.
getVariableDescriptor
((
JetProperty
)
declaration
);
if
(
bindingContext
.
hasBackingField
(
propertyDescriptor
))
{
final
JetExpression
initializer
=
((
JetProperty
)
declaration
).
getInitializer
();
if
(
initializer
!=
null
)
{
iv
.
load
(
0
,
JetTypeMapper
.
TYPE_OBJECT
);
codegen
.
genToJVMStack
(
initializer
);
iv
.
putfield
(
JetTypeMapper
.
getOwner
(
propertyDescriptor
),
propertyDescriptor
.
getName
(),
typeMapper
.
mapType
(
propertyDescriptor
.
getOutType
()).
getDescriptor
());
}
}
}
}
}
private
void
generateClassBody
(
JetClass
aClass
,
ClassVisitor
v
,
OwnerKind
kind
)
{
final
JetStandardLibrary
standardLibrary
=
JetStandardLibrary
.
getJetStandardLibrary
(
project
);
final
FunctionCodegen
functionCodegen
=
new
FunctionCodegen
(
v
,
standardLibrary
,
bindingContext
);
...
...
idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
浏览文件 @
85f46abc
...
...
@@ -60,7 +60,7 @@ public class ExpressionCodegen extends JetVisitor {
}
}
p
rivate
void
genToJVMStack
(
JetExpression
expr
)
{
p
ublic
void
genToJVMStack
(
JetExpression
expr
)
{
gen
(
expr
,
expressionType
(
expr
));
}
...
...
idea/src/org/jetbrains/jet/codegen/PropertyCodegen.java
浏览文件 @
85f46abc
package
org.jetbrains.jet.codegen
;
import
com.intellij.openapi.util.text.StringUtil
;
import
org.jetbrains.jet.lang.psi.JetConstantExpression
;
import
org.jetbrains.jet.lang.psi.JetExpression
;
import
org.jetbrains.jet.lang.psi.JetProperty
;
import
org.jetbrains.jet.lang.psi.JetPropertyAccessor
;
import
org.jetbrains.jet.lang.psi.*
;
import
org.jetbrains.jet.lang.resolve.BindingContext
;
import
org.jetbrains.jet.lang.types.*
;
import
org.jetbrains.jet.lexer.JetTokens
;
...
...
@@ -71,28 +68,38 @@ public class PropertyCodegen {
}
final
JetPropertyAccessor
getter
=
p
.
getGetter
();
if
(
getter
!=
null
)
{
functionCodegen
.
generateMethod
(
getter
,
kind
,
mapper
.
mapGetterSignature
(
propertyDescriptor
),
Collections
.<
ValueParameterDescriptor
>
emptyList
());
if
(
getter
.
getBodyExpression
()
!=
null
)
{
functionCodegen
.
generateMethod
(
getter
,
kind
,
mapper
.
mapGetterSignature
(
propertyDescriptor
),
Collections
.<
ValueParameterDescriptor
>
emptyList
());
}
else
if
(!
getter
.
hasModifier
(
JetTokens
.
PRIVATE_KEYWORD
))
{
generateDefaultGetter
(
p
,
getter
,
kind
);
}
}
else
if
(
p
.
hasModifier
(
JetTokens
.
PUBLIC_KEYWORD
))
{
generateDefaultGetter
(
p
,
kind
);
generateDefaultGetter
(
p
,
p
,
kind
);
}
final
JetPropertyAccessor
setter
=
p
.
getSetter
();
if
(
setter
!=
null
)
{
final
PropertySetterDescriptor
setterDescriptor
=
propertyDescriptor
.
getSetter
();
assert
setterDescriptor
!=
null
;
functionCodegen
.
generateMethod
(
setter
,
kind
,
mapper
.
mapSetterSignature
(
propertyDescriptor
),
setterDescriptor
.
getUnsubstitutedValueParameters
());
if
(
setter
.
getBodyExpression
()
!=
null
)
{
final
PropertySetterDescriptor
setterDescriptor
=
propertyDescriptor
.
getSetter
();
assert
setterDescriptor
!=
null
;
functionCodegen
.
generateMethod
(
setter
,
kind
,
mapper
.
mapSetterSignature
(
propertyDescriptor
),
setterDescriptor
.
getUnsubstitutedValueParameters
());
}
else
if
(!
p
.
hasModifier
(
JetTokens
.
PRIVATE_KEYWORD
))
{
generateDefaultSetter
(
p
,
setter
,
kind
);
}
}
else
if
(
p
.
hasModifier
(
JetTokens
.
PUBLIC_KEYWORD
)
&&
p
.
isVar
())
{
generateDefaultSetter
(
p
,
kind
);
generateDefaultSetter
(
p
,
p
,
kind
);
}
}
}
private
void
generateDefaultGetter
(
JetProperty
p
,
OwnerKind
kind
)
{
private
void
generateDefaultGetter
(
JetProperty
p
,
JetDeclaration
declaration
,
OwnerKind
kind
)
{
final
PropertyDescriptor
propertyDescriptor
=
(
PropertyDescriptor
)
context
.
getVariableDescriptor
(
p
);
int
flags
=
JetTypeMapper
.
getAccessModifiers
(
p
,
Opcodes
.
ACC_PUBLIC
);
int
flags
=
JetTypeMapper
.
getAccessModifiers
(
declaration
,
Opcodes
.
ACC_PUBLIC
);
if
(
kind
==
OwnerKind
.
NAMESPACE
)
{
flags
|=
Opcodes
.
ACC_STATIC
;
}
...
...
@@ -112,9 +119,9 @@ public class PropertyCodegen {
mv
.
visitEnd
();
}
private
void
generateDefaultSetter
(
JetProperty
p
,
OwnerKind
kind
)
{
private
void
generateDefaultSetter
(
JetProperty
p
,
JetDeclaration
declaration
,
OwnerKind
kind
)
{
final
PropertyDescriptor
propertyDescriptor
=
(
PropertyDescriptor
)
context
.
getVariableDescriptor
(
p
);
int
flags
=
JetTypeMapper
.
getAccessModifiers
(
p
,
Opcodes
.
ACC_PUBLIC
);
int
flags
=
JetTypeMapper
.
getAccessModifiers
(
declaration
,
Opcodes
.
ACC_PUBLIC
);
if
(
kind
==
OwnerKind
.
NAMESPACE
)
{
flags
|=
Opcodes
.
ACC_STATIC
;
}
...
...
idea/tests/org/jetbrains/jet/codegen/CodegenTestCase.java
浏览文件 @
85f46abc
...
...
@@ -3,6 +3,7 @@ package org.jetbrains.jet.codegen;
import
com.intellij.testFramework.LightProjectDescriptor
;
import
com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
;
import
org.jetbrains.annotations.NotNull
;
import
org.jetbrains.annotations.Nullable
;
import
org.jetbrains.jet.JetLightProjectDescriptor
;
import
org.jetbrains.jet.lang.JetFileType
;
import
org.jetbrains.jet.lang.psi.JetFile
;
...
...
@@ -97,16 +98,21 @@ public abstract class CodegenTestCase extends LightCodeInsightFixtureTestCase {
protected
Method
generateFunction
(
String
name
)
{
Class
aClass
=
generateNamespaceClass
();
return
findMethodByName
(
aClass
,
name
);
final
Method
method
=
findMethodByName
(
aClass
,
name
);
if
(
method
==
null
)
{
throw
new
IllegalArgumentException
(
"couldn't find method "
+
name
);
}
return
method
;
}
@Nullable
protected
static
Method
findMethodByName
(
Class
aClass
,
String
name
)
{
for
(
Method
method
:
aClass
.
getMethods
())
{
if
(
method
.
getName
().
equals
(
name
))
{
return
method
;
}
}
throw
new
IllegalArgumentException
(
"couldn't find method "
+
name
)
;
return
null
;
}
protected
static
void
assertIsCurrentTime
(
long
returnValue
)
{
...
...
idea/tests/org/jetbrains/jet/codegen/PropertyGenTest.java
浏览文件 @
85f46abc
...
...
@@ -73,4 +73,13 @@ public class PropertyGenTest extends CodegenTestCase {
String
value
=
(
String
)
method
.
invoke
(
null
,
"IDEA"
);
assertEquals
(
value
,
"IntelliJ IDEA"
);
}
public
void
testAccessorsWithoutBody
()
throws
Exception
{
loadText
(
"class AccessorsWithoutBody { public var foo: Int = 349\n get\n private set } "
);
final
Class
aClass
=
loadImplementationClass
(
generateClassesInFile
(),
"AccessorsWithoutBody"
);
final
Object
instance
=
aClass
.
newInstance
();
final
Method
getFoo
=
findMethodByName
(
aClass
,
"getFoo"
);
assertEquals
(
349
,
getFoo
.
invoke
(
instance
));
assertNull
(
findMethodByName
(
aClass
,
"setFoo"
));
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录