CharSequence added in to stdlib

This commit is contained in:
Alex Tkachman
2012-01-25 22:09:32 +02:00
parent 4545c72f69
commit c5d88251a9
8 changed files with 46 additions and 18 deletions
@@ -38,6 +38,7 @@ public class JetTypeMapper {
public static final Type JL_NUMBER_TYPE = Type.getObjectType("java/lang/Number"); public static final Type JL_NUMBER_TYPE = Type.getObjectType("java/lang/Number");
public static final Type JL_STRING_BUILDER = Type.getObjectType("java/lang/StringBuilder"); public static final Type JL_STRING_BUILDER = Type.getObjectType("java/lang/StringBuilder");
public static final Type JL_STRING_TYPE = Type.getObjectType("java/lang/String"); public static final Type JL_STRING_TYPE = Type.getObjectType("java/lang/String");
public static final Type JL_CHAR_SEQUENCE_TYPE = Type.getObjectType("java/lang/CharSequence");
private static final Type JL_COMPARABLE_TYPE = Type.getObjectType("java/lang/Comparable"); private static final Type JL_COMPARABLE_TYPE = Type.getObjectType("java/lang/Comparable");
public static final Type ARRAY_GENERIC_TYPE = Type.getType(Object[].class); public static final Type ARRAY_GENERIC_TYPE = Type.getType(Object[].class);
@@ -142,8 +143,6 @@ public class JetTypeMapper {
return mapType(jetType, OwnerKind.IMPLEMENTATION, signatureVisitor); return mapType(jetType, OwnerKind.IMPLEMENTATION, signatureVisitor);
} }
private HashMap<DeclarationDescriptor,Map<DeclarationDescriptor,String>> naming = new HashMap<DeclarationDescriptor, Map<DeclarationDescriptor, String>>();
private String getStableNameForObject(JetObjectDeclaration object, DeclarationDescriptor descriptor) { private String getStableNameForObject(JetObjectDeclaration object, DeclarationDescriptor descriptor) {
String local = getLocalNameForObject(object); String local = getLocalNameForObject(object);
if (local == null) return null; if (local == null) return null;
@@ -781,6 +780,8 @@ public class JetTypeMapper {
knowTypes.put(standardLibrary.getStringType(),JL_STRING_TYPE); knowTypes.put(standardLibrary.getStringType(),JL_STRING_TYPE);
knowTypes.put(standardLibrary.getNullableStringType(),JL_STRING_TYPE); knowTypes.put(standardLibrary.getNullableStringType(),JL_STRING_TYPE);
knowTypes.put(standardLibrary.getCharSequenceType(),JL_CHAR_SEQUENCE_TYPE);
knowTypes.put(standardLibrary.getNullableCharSequenceType(),JL_CHAR_SEQUENCE_TYPE);
for (JvmPrimitiveType jvmPrimitiveType : JvmPrimitiveType.values()) { for (JvmPrimitiveType jvmPrimitiveType : JvmPrimitiveType.values()) {
PrimitiveType primitiveType = jvmPrimitiveType.getPrimitiveType(); PrimitiveType primitiveType = jvmPrimitiveType.getPrimitiveType();
@@ -88,7 +88,7 @@ public class IntrinsicMethods {
declareIntrinsicFunction("Boolean", "not", 0, new Not()); declareIntrinsicFunction("Boolean", "not", 0, new Not());
declareIntrinsicFunction("String", "plus", 1, new Concat()); declareIntrinsicFunction("String", "plus", 1, new Concat());
declareIntrinsicFunction("String", "get", 1, new StringGetChar()); declareIntrinsicFunction("CharSequence", "get", 1, new StringGetChar());
declareOverload(myStdLib.getLibraryScope().getFunctions("toString"), 0, new ToString()); declareOverload(myStdLib.getLibraryScope().getFunctions("toString"), 0, new ToString());
declareOverload(myStdLib.getLibraryScope().getFunctions("equals"), 1, EQUALS); declareOverload(myStdLib.getLibraryScope().getFunctions("equals"), 1, EQUALS);
@@ -114,7 +114,7 @@ public class IntrinsicMethods {
// declareIntrinsicFunction("Any", "equals", 1, new Equals()); // declareIntrinsicFunction("Any", "equals", 1, new Equals());
// //
declareIntrinsicStringMethods(); declareIntrinsicStringMethods();
declareIntrinsicProperty("String", "length", new StringLength()); declareIntrinsicProperty("CharSequence", "length", new StringLength());
declareArrayMethods(); declareArrayMethods();
} }
@@ -24,7 +24,7 @@ public class StringGetChar implements IntrinsicMethod {
receiver.put(JetTypeMapper.TYPE_OBJECT, v); receiver.put(JetTypeMapper.TYPE_OBJECT, v);
if(arguments != null) if(arguments != null)
codegen.gen(arguments.get(0)).put(Type.INT_TYPE, v); codegen.gen(arguments.get(0)).put(Type.INT_TYPE, v);
v.invokevirtual("java/lang/String", "charAt", "(I)C"); v.invokeinterface("java/lang/CharSequence", "charAt", "(I)C");
return StackValue.onStack(Type.CHAR_TYPE); return StackValue.onStack(Type.CHAR_TYPE);
} }
} }
@@ -17,7 +17,7 @@ public class StringLength implements IntrinsicMethod {
@Override @Override
public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, Type expectedType, PsiElement element, List<JetExpression> arguments, StackValue receiver) { public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, Type expectedType, PsiElement element, List<JetExpression> arguments, StackValue receiver) {
receiver.put(JetTypeMapper.TYPE_OBJECT, v); receiver.put(JetTypeMapper.TYPE_OBJECT, v);
v.invokevirtual("java/lang/String", "length", "()I"); v.invokeinterface("java/lang/CharSequence", "length", "()I");
return StackValue.onStack(Type.INT_TYPE); return StackValue.onStack(Type.INT_TYPE);
} }
} }
@@ -179,6 +179,7 @@ public class JavaTypeTransformer {
} }
classTypesMap.put("java.lang.Object", JetStandardClasses.getNullableAnyType()); classTypesMap.put("java.lang.Object", JetStandardClasses.getNullableAnyType());
classTypesMap.put("java.lang.String", standardLibrary.getNullableStringType()); classTypesMap.put("java.lang.String", standardLibrary.getNullableStringType());
classTypesMap.put("java.lang.CharSequence", standardLibrary.getNullableCharSequenceType());
} }
return classTypesMap; return classTypesMap;
} }
@@ -191,6 +192,7 @@ public class JavaTypeTransformer {
classDescriptorMap.put(jvmPrimitiveType.getWrapper().getFqName(), standardLibrary.getPrimitiveClassDescriptor(primitiveType)); classDescriptorMap.put(jvmPrimitiveType.getWrapper().getFqName(), standardLibrary.getPrimitiveClassDescriptor(primitiveType));
} }
classDescriptorMap.put("java.lang.String", standardLibrary.getString()); classDescriptorMap.put("java.lang.String", standardLibrary.getString());
classDescriptorMap.put("java.lang.CharSequence", standardLibrary.getCharSequence());
} }
return classDescriptorMap; return classDescriptorMap;
} }
+6 -3
View File
@@ -43,13 +43,16 @@ class Boolean : Comparable<Boolean> {
fun equals(other : Any?) : Boolean fun equals(other : Any?) : Boolean
} }
class String() : Comparable<String> { trait CharSequence {
fun get(index : Int) : Char fun get(index : Int) : Char
val length : Int val length : Int
fun toString() : String
}
class String() : Comparable<String>, CharSequence {
fun plus(other : Any?) : String fun plus(other : Any?) : String
fun equals(other : Any?) : Boolean fun equals(other : Any?) : Boolean
} }
@@ -52,6 +52,7 @@ public class JetStandardLibrary {
private ClassDescriptor numberClass; private ClassDescriptor numberClass;
private ClassDescriptor charSequenceClass;
private ClassDescriptor stringClass; private ClassDescriptor stringClass;
private ClassDescriptor arrayClass; private ClassDescriptor arrayClass;
private ClassDescriptor iterableClass; private ClassDescriptor iterableClass;
@@ -59,6 +60,9 @@ public class JetStandardLibrary {
private ClassDescriptor comparableClass; private ClassDescriptor comparableClass;
private JetType stringType; private JetType stringType;
private JetType nullableStringType;
private JetType charSequenceType;
private JetType nullableCharSequenceType;
private JetType nullableTuple0Type; private JetType nullableTuple0Type;
@@ -67,7 +71,6 @@ public class JetStandardLibrary {
} }
private JetType tuple0Type; private JetType tuple0Type;
private JetType nullableStringType;
private Set<FunctionDescriptor> typeInfoFunction; private Set<FunctionDescriptor> typeInfoFunction;
@@ -127,6 +130,7 @@ public class JetStandardLibrary {
this.libraryScope = JetStandardClasses.STANDARD_CLASSES_NAMESPACE.getMemberScope(); this.libraryScope = JetStandardClasses.STANDARD_CLASSES_NAMESPACE.getMemberScope();
this.numberClass = (ClassDescriptor) libraryScope.getClassifier("Number"); this.numberClass = (ClassDescriptor) libraryScope.getClassifier("Number");
this.stringClass = (ClassDescriptor) libraryScope.getClassifier("String"); this.stringClass = (ClassDescriptor) libraryScope.getClassifier("String");
this.charSequenceClass = (ClassDescriptor) libraryScope.getClassifier("CharSequence");
this.arrayClass = (ClassDescriptor) libraryScope.getClassifier("Array"); this.arrayClass = (ClassDescriptor) libraryScope.getClassifier("Array");
this.iterableClass = (ClassDescriptor) libraryScope.getClassifier("Iterable"); this.iterableClass = (ClassDescriptor) libraryScope.getClassifier("Iterable");
@@ -136,6 +140,8 @@ public class JetStandardLibrary {
this.typeInfoFunction = libraryScope.getFunctions("typeinfo"); this.typeInfoFunction = libraryScope.getFunctions("typeinfo");
this.stringType = new JetTypeImpl(getString()); this.stringType = new JetTypeImpl(getString());
this.charSequenceType = new JetTypeImpl(getCharSequence());
this.nullableCharSequenceType = TypeUtils.makeNullable(charSequenceType);
this.nullableStringType = TypeUtils.makeNullable(stringType); this.nullableStringType = TypeUtils.makeNullable(stringType);
this.tuple0Type = new JetTypeImpl(JetStandardClasses.getTuple(0)); this.tuple0Type = new JetTypeImpl(JetStandardClasses.getTuple(0));
@@ -230,6 +236,12 @@ public class JetStandardLibrary {
return stringClass; return stringClass;
} }
@NotNull
public ClassDescriptor getCharSequence() {
initStdClasses();
return charSequenceClass;
}
@NotNull @NotNull
public ClassDescriptor getArray() { public ClassDescriptor getArray() {
initStdClasses(); initStdClasses();
@@ -311,6 +323,12 @@ public class JetStandardLibrary {
return stringType; return stringType;
} }
@NotNull
public JetType getCharSequenceType() {
initStdClasses();
return charSequenceType;
}
@NotNull @NotNull
public JetType getByteType() { public JetType getByteType() {
return getPrimitiveJetType(PrimitiveType.BYTE); return getPrimitiveJetType(PrimitiveType.BYTE);
@@ -371,11 +389,18 @@ public class JetStandardLibrary {
); );
} }
@NotNull
public JetType getNullableStringType() { public JetType getNullableStringType() {
initStdClasses(); initStdClasses();
return nullableStringType; return nullableStringType;
} }
@NotNull
public JetType getNullableCharSequenceType() {
initStdClasses();
return nullableCharSequenceType;
}
@NotNull @NotNull
public JetType getNullablePrimitiveJetType(PrimitiveType primitiveType) { public JetType getNullablePrimitiveJetType(PrimitiveType primitiveType) {
initStdClasses(); initStdClasses();
+5 -8
View File
@@ -40,6 +40,8 @@ inline fun String.startsWith(prefix: String) = (this as java.lang.String).starts
inline fun String.startsWith(prefix: String, toffset: Int) = (this as java.lang.String).startsWith(prefix, toffset) inline fun String.startsWith(prefix: String, toffset: Int) = (this as java.lang.String).startsWith(prefix, toffset)
inline fun String.contains(seq: CharSequence) : Boolean = (this as java.lang.String).contains(seq)
inline val String.size : Int inline val String.size : Int
get() = length() get() = length()
@@ -66,19 +68,14 @@ inline fun String(stringBuffer : java.lang.StringBuffer) = java.lang.String(stri
inline fun String(stringBuilder : java.lang.StringBuilder) = java.lang.String(stringBuilder) as String inline fun String(stringBuilder : java.lang.StringBuilder) = java.lang.String(stringBuilder) as String
/*
Iterator for characters of given String
*/
inline fun String.iterator() : CharIterator = (this as java.lang.String).iterator()
/* /*
Iterator for characters of given CharSequence Iterator for characters of given CharSequence
*/ */
inline fun java.lang.CharSequence.iterator() : CharIterator = object: jet.CharIterator() { inline fun CharSequence.iterator() : CharIterator = object: jet.CharIterator() {
private var index = 0 private var index = 0
public override fun nextChar(): Char = charAt(index++) public override fun nextChar(): Char = get(index++)
public override val hasNext: Boolean public override val hasNext: Boolean
get() = index < length() get() = index < length
} }