Better main function recognition and tests

This commit is contained in:
Sergey Mashkov
2015-07-23 21:12:14 +03:00
parent 273e69c02c
commit 8457b53f8b
14 changed files with 217 additions and 58 deletions
@@ -29,13 +29,11 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.resolve.annotations.AnnotationsPackage;
import org.jetbrains.kotlin.types.JetType;
import org.jetbrains.kotlin.types.TypeProjection;
import org.jetbrains.kotlin.types.checker.JetTypeChecker;
import org.jetbrains.kotlin.types.Variance;
import java.util.Collection;
import java.util.List;
import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilPackage.getBuiltIns;
public class MainFunctionDetector {
private final NotNullFunction<JetNamedFunction, FunctionDescriptor> getFunctionDescriptor;
@@ -63,9 +61,15 @@ public class MainFunctionDetector {
}
public boolean isMain(@NotNull JetNamedFunction function) {
if (!"main".equals(function.getName())) return false;
if (!"main".equals(function.getName()) && function.getAnnotationEntries().isEmpty()) {
return false;
}
FunctionDescriptor functionDescriptor = getFunctionDescriptor.fun(function);
if (!getJVMFunctionName(functionDescriptor).equals("main")) {
return false;
}
List<ValueParameterDescriptor> parameters = functionDescriptor.getValueParameters();
if (parameters.size() != 1) return false;
@@ -77,7 +81,12 @@ public class MainFunctionDetector {
if (typeArguments.size() != 1) return false;
JetType typeArgument = typeArguments.get(0).getType();
if (!JetTypeChecker.DEFAULT.equalTypes(typeArgument, getBuiltIns(functionDescriptor).getStringType())) return false;
if (!KotlinBuiltIns.isString(typeArgument)) {
return false;
}
if (typeArguments.get(0).getProjectionKind() != Variance.INVARIANT) {
return false;
}
if (DescriptorUtils.isTopLevelDeclaration(functionDescriptor)) return true;
@@ -110,4 +119,14 @@ public class MainFunctionDetector {
}
return null;
}
@NotNull
private static String getJVMFunctionName(FunctionDescriptor functionDescriptor) {
String platformName = DescriptorUtils.getPlatformName(functionDescriptor);
if (platformName != null) {
return platformName;
}
return functionDescriptor.getName().asString();
}
}