Inline flag calculation through inline annotation

This commit is contained in:
Mikhael Bogdanov
2013-11-21 12:59:24 +04:00
parent fd4816aa36
commit 9037449313
19 changed files with 83 additions and 43 deletions
@@ -45,8 +45,7 @@ public class AccessorForFunctionDescriptor extends SimpleFunctionDescriptorImpl
copyValueParameters(descriptor),
descriptor.getReturnType(),
Modality.FINAL,
Visibilities.INTERNAL,
/*isInline = */ false);
Visibilities.INTERNAL);
}
@NotNull
@@ -184,7 +184,7 @@ public abstract class ClassBodyCodegen extends MemberCodegen {
Name.special("<clinit>"),
CallableMemberDescriptor.Kind.SYNTHESIZED);
clInit.initialize(null, null, Collections.<TypeParameterDescriptor>emptyList(),
Collections.<ValueParameterDescriptor>emptyList(), null, null, Visibilities.PRIVATE, false);
Collections.<ValueParameterDescriptor>emptyList(), null, null, Visibilities.PRIVATE);
clInitCodegen = new ExpressionCodegen(method, new FrameMap(), Type.VOID_TYPE, context.intoFunction(clInit), state, this);
}
@@ -82,8 +82,7 @@ public class CodegenUtil {
fd.getValueParameters(),
fd.getReturnType(),
Modality.FINAL,
Visibilities.PUBLIC,
/*isInline = */false
Visibilities.PUBLIC
);
return invokeDescriptor;
}
@@ -112,7 +112,7 @@ public class NamespacePartCodegen extends MemberCodegen {
Name.special("<clinit>"),
CallableMemberDescriptor.Kind.SYNTHESIZED);
clInit.initialize(null, null, Collections.<TypeParameterDescriptor>emptyList(),
Collections.<ValueParameterDescriptor>emptyList(), null, null, Visibilities.PRIVATE, false);
Collections.<ValueParameterDescriptor>emptyList(), null, null, Visibilities.PRIVATE);
ExpressionCodegen codegen = new ExpressionCodegen(mv, frameMap, Type.VOID_TYPE, this.context.intoFunction(clInit), state, this);
@@ -241,9 +241,7 @@ public class DescriptorDeserializer {
local.valueParameters(proto, AnnotatedCallableKind.FUNCTION),
local.typeDeserializer.type(proto.getReturnType()),
modality(Flags.MODALITY.get(flags)),
visibility(Flags.VISIBILITY.get(flags)),
Flags.INLINE.get(flags)
visibility(Flags.VISIBILITY.get(flags))
);
return function;
}
@@ -340,8 +340,6 @@ public class DescriptorResolver {
boolean hasBody = function.getBodyExpression() != null;
Modality modality = resolveModalityFromModifiers(function, getDefaultModality(containingDescriptor, hasBody));
Visibility visibility = resolveVisibilityFromModifiers(function, getDefaultVisibility(function, containingDescriptor));
JetModifierList modifierList = function.getModifierList();
boolean isInline = KotlinBuiltIns.getInstance().getInlineType(functionDescriptor) != InlineStrategy.NOT_INLINE;
functionDescriptor.initialize(
receiverType,
getExpectedThisObjectIfNeeded(containingDescriptor),
@@ -349,8 +347,8 @@ public class DescriptorResolver {
valueParameterDescriptors,
returnType,
modality,
visibility,
isInline);
visibility
);
BindingContextUtils.recordFunctionDeclarationToDescriptor(trace, function, functionDescriptor);
return functionDescriptor;
@@ -381,8 +379,7 @@ public class DescriptorResolver {
Collections.<ValueParameterDescriptor>emptyList(),
returnType,
Modality.FINAL,
property.getVisibility(),
true
property.getVisibility()
);
trace.record(BindingContext.DATA_CLASS_COMPONENT_FUNCTION, parameter, functionDescriptor);
@@ -429,8 +426,7 @@ public class DescriptorResolver {
parameterDescriptors,
returnType,
Modality.FINAL,
classDescriptor.getVisibility(),
true
classDescriptor.getVisibility()
);
trace.record(BindingContext.DATA_CLASS_COPY_FUNCTION, classDescriptor, functionDescriptor);
@@ -198,8 +198,7 @@ public class ClosureExpressionsTypingVisitor extends ExpressionTypingVisitor {
valueParameterDescriptors,
/*unsubstitutedReturnType = */ null,
Modality.FINAL,
Visibilities.LOCAL,
/*isInline = */ false
Visibilities.LOCAL
);
BindingContextUtils.recordFunctionDeclarationToDescriptor(context.trace, functionLiteral, functionDescriptor);
return functionDescriptor;
@@ -119,8 +119,7 @@ public class ControlStructureTypingUtils {
valueParameters,
type,
Modality.FINAL,
Visibilities.PUBLIC,
/*isInline = */ false
Visibilities.PUBLIC
);
return function;
}
@@ -1,5 +1,5 @@
WARNING: $TESTDATA_DIR$/wrongAbiVersion.kt: (3, 9) Parameter 'x' is never used
ERROR: $TESTDATA_DIR$/wrongAbiVersion.kt: (4, 3) Unresolved reference: bar
ERROR: $TESTDATA_DIR$/wrongAbiVersionLib/wrong/WrongPackage.class: (0, 0) Class 'wrong/WrongPackage' was compiled with an incompatible version of Kotlin. Its ABI version is -1, expected ABI version is 11
ERROR: $TESTDATA_DIR$/wrongAbiVersionLib/ClassWithWrongAbiVersion.class: (0, 0) Class 'ClassWithWrongAbiVersion' was compiled with an incompatible version of Kotlin. Its ABI version is -1, expected ABI version is 11
ERROR: $TESTDATA_DIR$/wrongAbiVersionLib/wrong/WrongPackage.class: (0, 0) Class 'wrong/WrongPackage' was compiled with an incompatible version of Kotlin. Its ABI version is -1, expected ABI version is 12
ERROR: $TESTDATA_DIR$/wrongAbiVersionLib/ClassWithWrongAbiVersion.class: (0, 0) Class 'ClassWithWrongAbiVersion' was compiled with an incompatible version of Kotlin. Its ABI version is -1, expected ABI version is 12
COMPILATION_ERROR
@@ -0,0 +1,9 @@
package test
inline fun a() {}
inline(InlineStrategy.AS_FUNCTION) fun b() {}
inline(InlineStrategy.IN_PLACE) fun c() {}
inline(strategy = InlineStrategy.IN_PLACE) fun d() {}
@@ -0,0 +1,6 @@
package test
jet.inline() internal fun a(): jet.Unit
jet.inline(strategy = InlineStrategy.AS_FUNCTION: jet.InlineStrategy) internal fun b(): jet.Unit
jet.inline(strategy = InlineStrategy.IN_PLACE: jet.InlineStrategy) internal fun c(): jet.Unit
jet.inline(strategy = InlineStrategy.IN_PLACE: jet.InlineStrategy) internal fun d(): jet.Unit
@@ -31,7 +31,7 @@ import org.jetbrains.jet.jvm.compiler.AbstractLoadCompiledKotlinTest;
/** This class is generated by {@link org.jetbrains.jet.generators.tests.GenerateTests}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("compiler/testData/loadKotlin")
@InnerTestClasses({LoadCompiledKotlinTestGenerated.Annotations.class, LoadCompiledKotlinTestGenerated.Class.class, LoadCompiledKotlinTestGenerated.ClassFun.class, LoadCompiledKotlinTestGenerated.ClassObject.class, LoadCompiledKotlinTestGenerated.Constructor.class, LoadCompiledKotlinTestGenerated.DataClass.class, LoadCompiledKotlinTestGenerated.Fun.class, LoadCompiledKotlinTestGenerated.Prop.class, LoadCompiledKotlinTestGenerated.Type.class, LoadCompiledKotlinTestGenerated.Visibility.class})
@InnerTestClasses({LoadCompiledKotlinTestGenerated.Annotations.class, LoadCompiledKotlinTestGenerated.Class.class, LoadCompiledKotlinTestGenerated.ClassFun.class, LoadCompiledKotlinTestGenerated.ClassObject.class, LoadCompiledKotlinTestGenerated.Constructor.class, LoadCompiledKotlinTestGenerated.DataClass.class, LoadCompiledKotlinTestGenerated.Fun.class, LoadCompiledKotlinTestGenerated.Inline.class, LoadCompiledKotlinTestGenerated.Prop.class, LoadCompiledKotlinTestGenerated.Type.class, LoadCompiledKotlinTestGenerated.Visibility.class})
public class LoadCompiledKotlinTestGenerated extends AbstractLoadCompiledKotlinTest {
public void testAllFilesPresentInLoadKotlin() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/loadKotlin"), Pattern.compile("^(.+)\\.kt$"), true);
@@ -981,6 +981,19 @@ public class LoadCompiledKotlinTestGenerated extends AbstractLoadCompiledKotlinT
}
}
@TestMetadata("compiler/testData/loadKotlin/inline")
public static class Inline extends AbstractLoadCompiledKotlinTest {
public void testAllFilesPresentInInline() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/loadKotlin/inline"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("inlineFunction.kt")
public void testInlineFunction() throws Exception {
doTestWithAccessors("compiler/testData/loadKotlin/inline/inlineFunction.kt");
}
}
@TestMetadata("compiler/testData/loadKotlin/prop")
@InnerTestClasses({Prop.DefaultAccessors.class})
public static class Prop extends AbstractLoadCompiledKotlinTest {
@@ -1435,6 +1448,7 @@ public class LoadCompiledKotlinTestGenerated extends AbstractLoadCompiledKotlinT
suite.addTest(Constructor.innerSuite());
suite.addTestSuite(DataClass.class);
suite.addTest(Fun.innerSuite());
suite.addTestSuite(Inline.class);
suite.addTest(Prop.innerSuite());
suite.addTestSuite(Type.class);
suite.addTestSuite(Visibility.class);
@@ -33,7 +33,7 @@ import org.jetbrains.jet.lang.resolve.lazy.AbstractLazyResolveNamespaceComparing
@InnerTestClasses({LazyResolveNamespaceComparingTestGenerated.LoadKotlin.class, LazyResolveNamespaceComparingTestGenerated.CompiledJavaCompareWithKotlin.class, LazyResolveNamespaceComparingTestGenerated.NamespaceComparator.class})
public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyResolveNamespaceComparingTest {
@TestMetadata("compiler/testData/loadKotlin")
@InnerTestClasses({LoadKotlin.Annotations.class, LoadKotlin.Class.class, LoadKotlin.ClassFun.class, LoadKotlin.ClassObject.class, LoadKotlin.Constructor.class, LoadKotlin.DataClass.class, LoadKotlin.Fun.class, LoadKotlin.Prop.class, LoadKotlin.Type.class, LoadKotlin.Visibility.class})
@InnerTestClasses({LoadKotlin.Annotations.class, LoadKotlin.Class.class, LoadKotlin.ClassFun.class, LoadKotlin.ClassObject.class, LoadKotlin.Constructor.class, LoadKotlin.DataClass.class, LoadKotlin.Fun.class, LoadKotlin.Inline.class, LoadKotlin.Prop.class, LoadKotlin.Type.class, LoadKotlin.Visibility.class})
public static class LoadKotlin extends AbstractLazyResolveNamespaceComparingTest {
public void testAllFilesPresentInLoadKotlin() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/loadKotlin"), Pattern.compile("^(.+)\\.kt$"), true);
@@ -983,6 +983,19 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso
}
}
@TestMetadata("compiler/testData/loadKotlin/inline")
public static class Inline extends AbstractLazyResolveNamespaceComparingTest {
public void testAllFilesPresentInInline() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/loadKotlin/inline"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("inlineFunction.kt")
public void testInlineFunction() throws Exception {
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadKotlin/inline/inlineFunction.kt");
}
}
@TestMetadata("compiler/testData/loadKotlin/prop")
@InnerTestClasses({Prop.DefaultAccessors.class})
public static class Prop extends AbstractLazyResolveNamespaceComparingTest {
@@ -1437,6 +1450,7 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso
suite.addTest(Constructor.innerSuite());
suite.addTestSuite(DataClass.class);
suite.addTest(Fun.innerSuite());
suite.addTestSuite(Inline.class);
suite.addTest(Prop.innerSuite());
suite.addTestSuite(Type.class);
suite.addTestSuite(Visibility.class);
@@ -28,7 +28,7 @@ public final class JvmAbi {
* This constant is used to identify binary format (class file) versions
* If you change class file metadata format and/or naming conventions, please increase this number
*/
public static final int VERSION = 11;
public static final int VERSION = 12;
public static final String TRAIT_IMPL_CLASS_NAME = "$TImpl";
public static final String TRAIT_IMPL_SUFFIX = "$" + TRAIT_IMPL_CLASS_NAME;
@@ -169,8 +169,8 @@ public final class JavaFunctionResolver {
effectiveSignature.getValueParameters(),
effectiveSignature.getReturnType(),
Modality.convertFromFlags(method.isAbstract(), !method.isFinal()),
method.getVisibility(),
/*isInline = */ false
method.getVisibility()
/*TODO what if user annotate it with inline?*/
);
if (record) {
@@ -161,8 +161,7 @@ public class SingleAbstractMethodUtils {
Arrays.asList(parameter),
returnType,
Modality.FINAL,
samInterface.getVisibility(),
false
samInterface.getVisibility()
);
return result;
@@ -198,8 +197,7 @@ public class SingleAbstractMethodUtils {
valueParameters,
returnType,
Modality.FINAL,
original.getVisibility(),
false
original.getVisibility()
);
}
});
@@ -23,12 +23,14 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeSubstitutor;
import org.jetbrains.jet.lang.types.lang.InlineStrategy;
import org.jetbrains.jet.lang.types.lang.InlineUtil;
import java.util.List;
public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl implements SimpleFunctionDescriptor {
private boolean isInline = false;
private InlineStrategy inlineStrategy;
public SimpleFunctionDescriptorImpl(
@NotNull DeclarationDescriptor containingDeclaration,
@@ -48,6 +50,9 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
super(containingDeclaration, original, annotations, name, kind);
}
@NotNull
@Override
public SimpleFunctionDescriptorImpl initialize(
@Nullable JetType receiverParameterType,
@Nullable ReceiverParameterDescriptor expectedThisObject,
@@ -55,10 +60,11 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
@NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters,
@Nullable JetType unsubstitutedReturnType,
@Nullable Modality modality,
@NotNull Visibility visibility,
boolean isInline) {
super.initialize(receiverParameterType, expectedThisObject, typeParameters, unsubstitutedValueParameters, unsubstitutedReturnType, modality, visibility);
this.isInline = isInline;
@NotNull Visibility visibility
) {
super.initialize(receiverParameterType, expectedThisObject, typeParameters, unsubstitutedValueParameters, unsubstitutedReturnType,
modality, visibility);
this.inlineStrategy = InlineUtil.getInlineType(getAnnotations());
return this;
}
@@ -93,12 +99,16 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
@Override
public SimpleFunctionDescriptor copy(DeclarationDescriptor newOwner, Modality modality, Visibility visibility, Kind kind, boolean copyOverrides) {
SimpleFunctionDescriptorImpl copy = (SimpleFunctionDescriptorImpl)doSubstitute(TypeSubstitutor.EMPTY, newOwner, modality, visibility, false, copyOverrides, kind);
copy.isInline = isInline;
return copy;
}
@Override
public boolean isInline() {
return isInline;
return getInlineStrategy() != InlineStrategy.NOT_INLINE;
}
@NotNull
public InlineStrategy getInlineStrategy() {
return inlineStrategy;
}
}
@@ -87,7 +87,7 @@ public class DescriptorFactory {
return values.initialize(null, classObject.getThisAsReceiverParameter(), Collections.<TypeParameterDescriptor>emptyList(),
Collections.<ValueParameterDescriptor>emptyList(),
returnType, Modality.FINAL,
Visibilities.PUBLIC, false);
Visibilities.PUBLIC);
}
@NotNull
@@ -110,7 +110,7 @@ public class DescriptorFactory {
Collections.<TypeParameterDescriptor>emptyList(),
Collections.singletonList(parameterDescriptor),
returnType, Modality.FINAL,
Visibilities.PUBLIC, false);
Visibilities.PUBLIC);
}
@Nullable
@@ -291,8 +291,7 @@ public class ErrorUtils {
Collections.<ValueParameterDescriptor>emptyList(), // TODO
createErrorType("<ERROR FUNCTION RETURN TYPE>"),
Modality.OPEN,
Visibilities.INTERNAL,
/*isInline = */ false
Visibilities.INTERNAL
);
return function;
}