diff --git a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/FieldProcessor.java b/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/FieldProcessor.java index 6406f76f1da0..ae603d16c355 100644 --- a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/FieldProcessor.java +++ b/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/FieldProcessor.java @@ -98,7 +98,7 @@ final class FieldProcessor { writeMethodDeclarationJava(out, method); out.openBlock(); if (effectiveFieldName != null) { - out.append("return ").append(TypeHandler.FIELD_PREFIX).append(effectiveFieldName).semi(); + out.append("return ").append(TypeWriter.FIELD_PREFIX).append(effectiveFieldName).semi(); } out.closeBlock(); } diff --git a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/GlobalScope.java b/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/GlobalScope.java index c3c7dacd5a1f..baa2815e251c 100644 --- a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/GlobalScope.java +++ b/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/GlobalScope.java @@ -12,46 +12,46 @@ import java.util.Map; public class GlobalScope { private final State state; - public GlobalScope(Collection> typeHandlers, Collection, String>> basePackages) { - state = new State(typeHandlers, basePackages); + public GlobalScope(Collection> typeWriters, Collection, String>> basePackages) { + state = new State(typeWriters, basePackages); } public GlobalScope(GlobalScope globalScope) { state = globalScope.state; } - public String getTypeImplReference(TypeHandler typeHandler) { - return state.getTypeImplReference(typeHandler); + public String getTypeImplReference(TypeWriter typeWriter) { + return state.getTypeImplReference(typeWriter); } - public String requireFactoryGenerationAndGetName(TypeHandler typeHandler) { - return state.requireFactoryGenerationAndGetName(typeHandler); + public String requireFactoryGenerationAndGetName(TypeWriter typeWriter) { + return state.requireFactoryGenerationAndGetName(typeWriter); } - public String getTypeImplShortName(TypeHandler typeHandler) { - return state.getTypeImplShortName(typeHandler); + public String getTypeImplShortName(TypeWriter typeWriter) { + return state.getTypeImplShortName(typeWriter); } public FileScope newFileScope(StringBuilder output) { return new FileScope(this, output); } - public List> getTypeFactories() { + public List> getTypeFactories() { return state.typesWithFactoriesList; } private static class State { - private final Map, String> typeToName; + private final Map, String> typeToName; private final Collection, String>> basePackages; - private final THashSet> typesWithFactories = new THashSet<>(); - private final List> typesWithFactoriesList = new ArrayList<>(); + private final THashSet> typesWithFactories = new THashSet<>(); + private final List> typesWithFactoriesList = new ArrayList<>(); - State(Collection> typeHandlers, Collection, String>> basePackages) { + State(Collection> typeWriters, Collection, String>> basePackages) { this.basePackages = basePackages; int uniqueCode = 0; - Map, String> result = new THashMap<>(typeHandlers.size()); - for (TypeHandler handler : typeHandlers) { + Map, String> result = new THashMap<>(typeWriters.size()); + for (TypeWriter handler : typeWriters) { String conflict = result.put(handler, Util.TYPE_NAME_PREFIX + Integer.toString(uniqueCode++)); if (conflict != null) { throw new RuntimeException(); @@ -60,14 +60,14 @@ public class GlobalScope { typeToName = result; } - String getTypeImplReference(TypeHandler typeHandler) { - String localName = typeToName.get(typeHandler); + String getTypeImplReference(TypeWriter typeWriter) { + String localName = typeToName.get(typeWriter); if (localName != null) { return localName; } for (Map, String> base : basePackages) { - String result = base.get(typeHandler.typeClass); + String result = base.get(typeWriter.typeClass); if (result != null) { return result; } @@ -76,17 +76,17 @@ public class GlobalScope { throw new RuntimeException(); } - public String requireFactoryGenerationAndGetName(TypeHandler typeHandler) { - String name = getTypeImplShortName(typeHandler); - if (typesWithFactories.add(typeHandler)) { - typesWithFactoriesList.add(typeHandler); + public String requireFactoryGenerationAndGetName(TypeWriter typeWriter) { + String name = getTypeImplShortName(typeWriter); + if (typesWithFactories.add(typeWriter)) { + typesWithFactoriesList.add(typeWriter); } return name; } @NotNull - String getTypeImplShortName(TypeHandler typeHandler) { - return typeToName.get(typeHandler); + String getTypeImplShortName(TypeWriter typeWriter) { + return typeToName.get(typeWriter); } } } diff --git a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/InterfaceReader.java b/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/InterfaceReader.java index 4f71a40d27ce..5cc874fe228b 100644 --- a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/InterfaceReader.java +++ b/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/InterfaceReader.java @@ -55,7 +55,7 @@ class InterfaceReader { } }; - private final LinkedHashMap, TypeHandler> typeToTypeHandler; + private final LinkedHashMap, TypeWriter> typeToTypeHandler; final List> refs = new ArrayList<>(); final List subtypeCasters = new ArrayList<>(); @@ -67,22 +67,22 @@ class InterfaceReader { } } - private InterfaceReader(LinkedHashMap, TypeHandler> typeToTypeHandler) { + private InterfaceReader(LinkedHashMap, TypeWriter> typeToTypeHandler) { this.typeToTypeHandler = typeToTypeHandler; } - public static TypeHandler createHandler(LinkedHashMap, TypeHandler> typeToTypeHandler, Class aClass) { + public static TypeWriter createHandler(LinkedHashMap, TypeWriter> typeToTypeHandler, Class aClass) { InterfaceReader reader = new InterfaceReader(typeToTypeHandler); reader.processed.addAll(typeToTypeHandler.keySet()); reader.go(new Class[]{aClass}); return typeToTypeHandler.get(aClass); } - LinkedHashMap, TypeHandler> go() { + LinkedHashMap, TypeWriter> go() { return go(typeToTypeHandler.keySet().toArray(new Class[typeToTypeHandler.size()])); } - private LinkedHashMap, TypeHandler> go(Class[] classes) { + private LinkedHashMap, TypeWriter> go(Class[] classes) { for (Class typeClass : classes) { createIfNotExists(typeClass); } @@ -146,18 +146,18 @@ class InterfaceReader { } } - TypeHandler typeHandler = new TypeHandler<>(typeClass, getSuperclassRef(typeClass), + TypeWriter typeWriter = new TypeWriter<>(typeClass, getSuperclassRef(typeClass), fields.volatileFields, fields.methodHandlerMap, fields.fieldLoaders, fields.lazyRead); for (TypeRef ref : refs) { if (ref.typeClass == typeClass) { assert ref.type == null; - ref.type = typeHandler; + ref.type = typeWriter; break; } } - typeToTypeHandler.put(typeClass, typeHandler); + typeToTypeHandler.put(typeClass, typeWriter); } ValueReader getFieldTypeParser(Type type, boolean isSubtyping, @Nullable Method method) { diff --git a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/ReadDelegate.java b/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/ReadDelegate.java index 102cb4944b2f..e199cc909793 100644 --- a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/ReadDelegate.java +++ b/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/ReadDelegate.java @@ -11,13 +11,13 @@ class ReadDelegate { private static final List STATIC_METHOD_PARAM_NAME_LIST = Collections.singletonList(Util.READER_NAME); private static final List STATIC_METHOD_PARAM_NAME_LIST2 = Arrays.asList(Util.READER_NAME, "nextName"); - private final TypeHandler typeHandler; + private final TypeWriter typeHandler; private final boolean isList; private final List paramNames; - ReadDelegate(@NotNull TypeHandler typeHandler, boolean isList, boolean hasNextNameParam) { - this.typeHandler = typeHandler; + ReadDelegate(@NotNull TypeWriter typeWriter, boolean isList, boolean hasNextNameParam) { + this.typeHandler = typeWriter; this.isList = isList; paramNames = hasNextNameParam ? STATIC_METHOD_PARAM_NAME_LIST2 : STATIC_METHOD_PARAM_NAME_LIST; diff --git a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/ReaderGenerator.java b/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/ReaderGenerator.java index 56981fbd9985..5c18b9d7d135 100644 --- a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/ReaderGenerator.java +++ b/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/ReaderGenerator.java @@ -23,7 +23,7 @@ public final class ReaderGenerator { private final String className; final Collection, String>> basePackagesMap; - final LinkedHashMap, TypeHandler> typeToTypeHandler; + final LinkedHashMap, TypeWriter> typeToTypeHandler; final ReaderRoot root; public GenerateConfiguration(String packageName, String className, Class readerRootClass, Class[] protocolInterfaces) { @@ -107,8 +107,8 @@ public final class ReaderGenerator { FileScope fileScope = generate(configuration, new StringBuilder()); Map, String> typeToImplClassName = new THashMap<>(); - for (TypeHandler typeHandler : configuration.typeToTypeHandler.values()) { - typeToImplClassName.put(typeHandler.typeClass, configuration.packageName + "." + configuration.className + "." + fileScope.getTypeImplShortName(typeHandler)); + for (TypeWriter typeWriter : configuration.typeToTypeHandler.values()) { + typeToImplClassName.put(typeWriter.typeClass, configuration.packageName + "." + configuration.className + "." + fileScope.getTypeImplShortName(typeWriter)); } return typeToImplClassName; } @@ -129,14 +129,14 @@ public final class ReaderGenerator { ClassScope rootClassScope = fileScope.newClassScope(); configuration.root.writeStaticMethodJava(rootClassScope); - for (TypeHandler typeHandler : configuration.typeToTypeHandler.values()) { + for (TypeWriter typeWriter : configuration.typeToTypeHandler.values()) { out.newLine(); - typeHandler.write(rootClassScope); + typeWriter.write(rootClassScope); out.newLine(); } boolean isFirst = true; - for (TypeHandler typeHandler : globalScope.getTypeFactories()) { + for (TypeWriter typeWriter : globalScope.getTypeFactories()) { if (isFirst) { isFirst = false; } @@ -144,13 +144,13 @@ public final class ReaderGenerator { out.newLine(); } - String originName = typeHandler.typeClass.getCanonicalName(); - out.newLine().append("private static final class ").append(globalScope.getTypeImplShortName(typeHandler)).append(Util.TYPE_FACTORY_NAME_POSTFIX).append(" extends ObjectFactory<"); + String originName = typeWriter.typeClass.getCanonicalName(); + out.newLine().append("private static final class ").append(globalScope.getTypeImplShortName(typeWriter)).append(Util.TYPE_FACTORY_NAME_POSTFIX).append(" extends ObjectFactory<"); out.append(originName).append('>').openBlock(); out.append("@Override").newLine().append("public ").append(originName).append(" read(").append(Util.JSON_READER_PARAMETER_DEF); out.append(')').openBlock(); out.append("return "); - typeHandler.writeInstantiateCode(rootClassScope, out); + typeWriter.writeInstantiateCode(rootClassScope, out); out.append('(').append(Util.READER_NAME).append(", null);").closeBlock(); out.closeBlock(); } diff --git a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/ReaderRoot.java b/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/ReaderRoot.java index 8a480f9ec819..1e4015dae8c9 100644 --- a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/ReaderRoot.java +++ b/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/ReaderRoot.java @@ -13,11 +13,11 @@ import java.util.*; class ReaderRoot { private final Class rootClass; - private final LinkedHashMap, TypeHandler> typeToTypeHandler; + private final LinkedHashMap, TypeWriter> typeToTypeHandler; private final Set> visitedInterfaces = new THashSet<>(1); final LinkedHashMap methodMap = new LinkedHashMap<>(); - ReaderRoot(Class rootClass, LinkedHashMap, TypeHandler> typeToTypeHandler) { + ReaderRoot(Class rootClass, LinkedHashMap, TypeWriter> typeToTypeHandler) { this.rootClass = rootClass; this.typeToTypeHandler = typeToTypeHandler; readInterfaceRecursive(rootClass); @@ -60,10 +60,10 @@ class ReaderRoot { } //noinspection SuspiciousMethodCalls - TypeHandler typeHandler = typeToTypeHandler.get(returnType); - if (typeHandler == null) { - typeHandler = InterfaceReader.createHandler(typeToTypeHandler, m.getReturnType()); - if (typeHandler == null) { + TypeWriter typeWriter = typeToTypeHandler.get(returnType); + if (typeWriter == null) { + typeWriter = InterfaceReader.createHandler(typeToTypeHandler, m.getReturnType()); + if (typeWriter == null) { throw new JsonProtocolModelParseException("Unknown return type in " + m); } } @@ -74,7 +74,7 @@ class ReaderRoot { } Type argument = arguments[0]; if (argument == JsonReaderEx.class || argument == Object.class) { - methodMap.put(m, new ReadDelegate(typeHandler, isList, arguments.length != 1)); + methodMap.put(m, new ReadDelegate(typeWriter, isList, arguments.length != 1)); } else { throw new JsonProtocolModelParseException("Unrecognized argument type in " + m); diff --git a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/SubtypeCaster.java b/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/SubtypeCaster.java index 12ea2d964925..6e2021fe2786 100644 --- a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/SubtypeCaster.java +++ b/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/SubtypeCaster.java @@ -17,7 +17,7 @@ abstract class SubtypeCaster { abstract void writeJava(TextOutput out); - TypeHandler getSubtypeHandler() { + TypeWriter getSubtypeHandler() { return subtypeRef.type; } } \ No newline at end of file diff --git a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/TypeHandler.java b/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/TypeHandler.java deleted file mode 100644 index 3b17bb3f0c6b..000000000000 --- a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/TypeHandler.java +++ /dev/null @@ -1,251 +0,0 @@ -package org.jetbrains.protocolReader; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.jsonProtocol.JsonObjectBased; - -import java.lang.reflect.Method; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -class TypeHandler { - public static final char FIELD_PREFIX = '_'; - - final Class typeClass; - - private final List volatileFields; - - private final LinkedHashMap methodHandlerMap; - - /** Loaders that should read values and save them in field array on parse time. */ - private final List fieldLoaders; - - /** Subtype aspects of the type or null */ - final ExistingSubtypeAspect subtypeAspect; - - private final boolean hasLazyFields; - - TypeHandler(Class typeClass, TypeRef jsonSuperClass, - List volatileFields, - LinkedHashMap methodHandlerMap, - List fieldLoaders, - boolean hasLazyFields) { - this.typeClass = typeClass; - this.volatileFields = volatileFields; - this.methodHandlerMap = methodHandlerMap; - this.fieldLoaders = fieldLoaders; - this.hasLazyFields = hasLazyFields; - subtypeAspect = jsonSuperClass == null ? null : new ExistingSubtypeAspect(jsonSuperClass); - } - - public void writeInstantiateCode(@NotNull ClassScope scope, @NotNull TextOutput out) { - writeInstantiateCode(scope, false, out); - } - - public void writeInstantiateCode(@NotNull ClassScope scope, boolean deferredReading, @NotNull TextOutput out) { - String className = scope.getTypeImplReference(this); - if (deferredReading || subtypeAspect == null) { - out.append("new ").append(className); - } - else { - subtypeAspect.writeInstantiateCode(className, out); - } - } - - public void write(@NotNull FileScope fileScope) { - TextOutput out = fileScope.getOutput(); - String valueImplClassName = fileScope.getTypeImplShortName(this); - out.append("private static final class ").append(valueImplClassName); - - out.append(" implements ").append(typeClass.getCanonicalName()).openBlock(); - - if (hasLazyFields || JsonObjectBased.class.isAssignableFrom(typeClass)) { - out.append("private ").append(Util.JSON_READER_CLASS_NAME).space().append(Util.PENDING_INPUT_READER_NAME).semi().newLine(); - } - - ClassScope classScope = fileScope.newClassScope(); - for (VolatileFieldBinding field : volatileFields) { - field.writeFieldDeclaration(classScope, out); - out.newLine(); - } - - for (FieldLoader loader : fieldLoaders) { - out.append("private").space(); - loader.valueReader.appendFinishedValueTypeName(out); - out.space().append(FIELD_PREFIX).append(loader.name); - if (loader.valueReader instanceof PrimitiveValueReader) { - String defaultValue = ((PrimitiveValueReader)loader.valueReader).defaultValue; - if (defaultValue != null) { - out.append(" = ").append(defaultValue); - } - } - out.semi(); - out.newLine(); - } - - if (subtypeAspect != null) { - subtypeAspect.writeSuperFieldJava(out); - } - - writeConstructorMethod(valueImplClassName, classScope, out); - out.newLine(); - - if (subtypeAspect != null) { - subtypeAspect.writeParseMethod(valueImplClassName, classScope, out); - } - - for (Map.Entry entry : methodHandlerMap.entrySet()) { - out.newLine(); - entry.getValue().writeMethodImplementationJava(classScope, entry.getKey(), out); - out.newLine(); - } - - writeBaseMethods(out); - if (subtypeAspect != null) { - subtypeAspect.writeGetSuperMethodJava(out); - } - out.indentOut().append('}'); - } - - /** - * Generates Java implementation of standard methods of JSON type class (if needed): - * {@link org.jetbrains.jsonProtocol.JsonObjectBased#getDeferredReader()} - */ - private void writeBaseMethods(TextOutput out) { - Class typeClass = this.typeClass; - Method method; - try { - method = typeClass.getMethod("getDeferredReader"); - } - catch (SecurityException e) { - throw new RuntimeException(e); - } - catch (NoSuchMethodException ignored) { - // Method not found, skip. - return; - } - - out.newLine(); - MethodHandler.writeMethodDeclarationJava(out, method); - out.openBlock(); - out.append("return ").append(Util.PENDING_INPUT_READER_NAME).semi(); - out.closeBlock(); - } - - private void writeConstructorMethod(@NotNull String valueImplClassName, @NotNull ClassScope classScope, @NotNull TextOutput out) { - out.newLine().append(valueImplClassName).append('(').append(Util.JSON_READER_PARAMETER_DEF).comma().append("String name"); - if (subtypeAspect != null) { - subtypeAspect.writeSuperConstructorParamJava(out); - } - out.append(')').openBlock(); - - if (subtypeAspect != null) { - subtypeAspect.writeSuperConstructorInitialization(out); - } - - if (JsonObjectBased.class.isAssignableFrom(typeClass) || hasLazyFields) { - out.append(Util.PENDING_INPUT_READER_NAME).append(" = ").append(Util.READER_NAME).append(".subReader()").semi().newLine(); - } - - if (fieldLoaders.isEmpty()) { - out.append(Util.READER_NAME).append(".skipValue()").semi(); - } - else { - out.append("if (name == null)").openBlock(); - { - out.append("if (reader.beginObject().hasNext())").openBlock(); - { - out.append("name = reader.nextName()").semi(); - } - out.closeBlock(); - out.newLine().append("else").openBlock(); - { - out.append("return").semi(); - } - out.closeBlock(); - } - out.closeBlock(); - out.newLine(); - - writeReadFields(out, classScope); - - // we don't read all data if we have lazy fields, so, we should not check end of stream - //if (!hasLazyFields) { - out.newLine().newLine().append(Util.READER_NAME).append(".endObject()").semi(); - //} - } - out.closeBlock(); - } - - private void writeReadFields(TextOutput out, ClassScope classScope) { - boolean stopIfAllFieldsWereRead = hasLazyFields; - boolean hasOnlyOneFieldLoader = fieldLoaders.size() == 1; - boolean isTracedStop = stopIfAllFieldsWereRead && !hasOnlyOneFieldLoader; - if (isTracedStop) { - out.newLine().append("int i = 0").semi(); - } - - out.newLine().append("do").openBlock(); - boolean isFirst = true; - String operator = "if"; - for (FieldLoader fieldLoader : fieldLoaders) { - if (!isFirst) { - out.newLine(); - } - - out.append(operator).append(" (name"); - out.append(".equals(\"").append(fieldLoader.jsonName).append("\"))").openBlock(); - { - String primitiveValueName = fieldLoader.valueReader instanceof ObjectValueReader ? ((ObjectValueReader)fieldLoader.valueReader).primitiveValueName : null; - if (primitiveValueName != null) { - out.append("if (reader.peek() == com.google.gson.stream.JsonToken.BEGIN_OBJECT)").openBlock(); - } - assignField(out, fieldLoader.name); - - fieldLoader.valueReader.writeReadCode(classScope, false, out); - out.semi(); - - if (primitiveValueName != null) { - out.closeBlock(); - out.newLine().append("else").openBlock(); - - assignField(out, primitiveValueName + "Type"); - out.append("reader.peek()").semi().newLine(); - - assignField(out, primitiveValueName); - out.append("reader.nextString(true)").semi(); - - out.closeBlock(); - } - - if (stopIfAllFieldsWereRead && !isTracedStop) { - out.newLine().append(Util.READER_NAME).append(".skipValues()").semi().newLine().append("break").semi(); - } - } - out.closeBlock(); - - if (isFirst) { - isFirst = false; - operator = "else if"; - } - } - - out.newLine().append("else").openBlock().append("reader.skipValue();"); - if (isTracedStop) { - out.newLine().append("continue").semi(); - } - out.closeBlock(); - if (isTracedStop) { - out.newLine().newLine().append("if (i == ").append(fieldLoaders.size() - 1).append(")").openBlock(); - out.append(Util.READER_NAME).append(".skipValues()").semi().newLine().append("break").semi().closeBlock(); - out.newLine().append("else").openBlock().append("i++").semi().closeBlock(); - } - out.closeBlock(); - out.newLine().append("while ((name = reader.nextNameOrNull()) != null)").semi(); - } - - @NotNull - private static TextOutput assignField(TextOutput out, String fieldName) { - return out.append(FIELD_PREFIX).append(fieldName).append(" = "); - } -} \ No newline at end of file diff --git a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/TypeRef.java b/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/TypeRef.java index d92e9af533cb..f78a3fe22a32 100644 --- a/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/TypeRef.java +++ b/platform/script-debugger/protocol/protocol-reader/src/org/jetbrains/protocolReader/TypeRef.java @@ -2,7 +2,7 @@ package org.jetbrains.protocolReader; class TypeRef { final Class typeClass; - TypeHandler type; + TypeWriter type; TypeRef(Class typeClass) { this.typeClass = typeClass;