From 9fc257a94216b37ac3cdaf57cd83b572ede176d6 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Fri, 19 Jun 2026 19:02:10 +0200 Subject: [PATCH 01/10] Enum Class Declaration fix # Conflicts: # key.core/src/main/resources/de/uka/ilkd/key/proof/rules/java5.key --- key.core/src/main/antlr4/JavaKeYLexer.g4 | 1 + key.core/src/main/antlr4/JavaKeYParser.g4 | 1 + .../ast/declaration/EnumClassDeclaration.java | 49 +++++++++----- .../key/nparser/builder/TacletPBuilder.java | 1 + .../varexp/ConstructorBasedBuilder.java | 13 +++- .../varexp/TacletBuilderManipulators.java | 8 +-- .../conditions/EnumConstantCondition.java | 65 ++++++++++++++----- .../rule/conditions/EnumTypeCondition.java | 6 ++ .../rule/metaconstruct/EnumConstantValue.java | 45 ++++--------- .../key/java/JavaRedux/java/lang/Enum.java | 8 ++- .../de/uka/ilkd/key/proof/rules/java5.key | 40 +++++++----- .../key/gui/sourceview/KeYEditorLexer.java | 4 +- 12 files changed, 155 insertions(+), 86 deletions(-) diff --git a/key.core/src/main/antlr4/JavaKeYLexer.g4 b/key.core/src/main/antlr4/JavaKeYLexer.g4 index 9ea0ac834ee..6201035a43f 100644 --- a/key.core/src/main/antlr4/JavaKeYLexer.g4 +++ b/key.core/src/main/antlr4/JavaKeYLexer.g4 @@ -40,6 +40,7 @@ ISARRAY:'\\isArray'; ISARRAYLENGTH:'\\isArrayLength'; ISCONSTANT: '\\isConstant'; ISENUMTYPE:'\\isEnumType'; +ISENUMCONST:'\\isEnumConst'; ISINDUCTVAR:'\\isInductVar'; ISLOCALVARIABLE : '\\isLocalVariable'; ISOBSERVER : '\\isObserver'; diff --git a/key.core/src/main/antlr4/JavaKeYParser.g4 b/key.core/src/main/antlr4/JavaKeYParser.g4 index 48c37383526..948371ae62e 100644 --- a/key.core/src/main/antlr4/JavaKeYParser.g4 +++ b/key.core/src/main/antlr4/JavaKeYParser.g4 @@ -215,6 +215,7 @@ varexpId: // weigl, 2021-03-12: This will be later just an arbitrary identifier. | SIMPLIFY_IF_THEN_ELSE_UPDATE | CONTAINS_ASSIGNMENT | ISENUMTYPE + | ISENUMCONST | ISTHISREFERENCE | STATICMETHODREFERENCE | ISREFERENCEARRAY diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java b/key.core/src/main/java/de/uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java index aaf2a962488..33d653eed97 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java +++ b/key.core/src/main/java/de/uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java @@ -3,18 +3,20 @@ * SPDX-License-Identifier: GPL-2.0-only */ package de.uka.ilkd.key.java.ast.declaration; -import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; +import java.util.Map; import de.uka.ilkd.key.java.ast.abstraction.KeYJavaType; import de.uka.ilkd.key.java.ast.abstraction.Type; import de.uka.ilkd.key.logic.JavaDLFieldNames; import de.uka.ilkd.key.logic.ProgramElementName; import de.uka.ilkd.key.logic.op.IProgramVariable; -import de.uka.ilkd.key.logic.op.ProgramVariable; import org.key_project.util.ExtList; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; + /** * This class is used for wrapping an enum into a standard class type. * @@ -22,27 +24,30 @@ * In addition the programvariables that represent enum constants are memorized. Thus this class is * able to have queries on the enum constants. * + * mulbrich: Update 2025 (a mere 19 years later): + * Updated from the old heap model to the new one. + * * @author mulbrich - * @since 2006-12-10 + * @since 2006-12-10, updated 2025-10-24 by MU */ public class EnumClassDeclaration extends ClassDeclaration { /** * store the program variables which represent the enum constants + * in a lookup map from name to (ordinal index, program variable) */ - private final List constants = new ArrayList<>(); + private final Map> constants = + new HashMap<>(); /** * create a new EnumClassDeclaration that describes an enum defintion. It merely wraps a * ClassDeclaration but has memory about which fields have been declared as enum constants. * - * @param children - * children in the ast (members) - * @param fullName - * of the class/enum - * @param isLibrary - * see class constructor + * @param children children in the ast (members) + * @param fullName of the class/enum + * @param isLibrary see class constructor + * @param enumConstantDeclarations the declarations for the enum constants */ // TODO javaparser public EnumClassDeclaration( @@ -50,10 +55,12 @@ public EnumClassDeclaration( /* , List enumConstantDeclarations */) { super(children, fullName, isLibrary); - // for (EnumConstantDeclaration ecd : enumConstantDeclarations) { - // String constName = ecd.getEnumConstantSpecification().getName(); - // constants.add(findAttr(constName)); - // } + int ordinal = 0; + for (EnumConstantDeclaration ecd : enumConstantDeclarations) { + String constName = ecd.getEnumConstantSpecification().getName(); + constants.put(constName, new Pair<>(ordinal, findAttr(constName))); + ordinal++; + } } /* @@ -142,4 +149,16 @@ public static int indexOf(ProgramVariable attribute) { } } + + /** + * get the constant with the given name, including its ordinal index. + * + * @param fieldName the name of the enum constant + * @return a pair of (index, program variable) of the enum constant with the given name or null + * if there is no such constant + */ + public @Nullable Pair<@NonNull Integer, @NonNull IProgramVariable> getConstant( + String fieldName) { + return constants.get(fieldName); + } } diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/TacletPBuilder.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/TacletPBuilder.java index dd4db64b434..67073e5f6a5 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/TacletPBuilder.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/TacletPBuilder.java @@ -823,6 +823,7 @@ private boolean applyManipulator(boolean negated, Object[] args, manipulator.apply(peekTBuilder(), args, parameters, negated); return true; } catch (Throwable e) { + LOGGER.debug("Unexpected exception while producing variable condition", e); return false; } } diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/varexp/ConstructorBasedBuilder.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/varexp/ConstructorBasedBuilder.java index a5353a2ef01..b35352cfc0a 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/varexp/ConstructorBasedBuilder.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/varexp/ConstructorBasedBuilder.java @@ -10,7 +10,12 @@ import org.key_project.prover.rules.VariableCondition; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public class ConstructorBasedBuilder extends AbstractConditionBuilder { + + private static final Logger LOGGER = LoggerFactory.getLogger(ConstructorBasedBuilder.class); private final Class clazz; private final boolean negationSupported; @@ -54,8 +59,14 @@ public VariableCondition build(Object[] arguments, List parameters, bool return (VariableCondition) constructor.newInstance(args); } catch (InstantiationException | IllegalAccessException | InvocationTargetException | IllegalArgumentException ignored) { + LOGGER.debug("Constructor " + constructor + + " does not match the given arguments for VariableCondition " + clazz + + ". Trying next constructor."); } } - throw new RuntimeException(); + + throw new RuntimeException( + "No matching constructor found for VariableCondition " + clazz + " with args " + + Arrays.toString(args)); } } diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/varexp/TacletBuilderManipulators.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/varexp/TacletBuilderManipulators.java index 67065ce497c..19a9ef3d20c 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/varexp/TacletBuilderManipulators.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/varexp/TacletBuilderManipulators.java @@ -228,7 +228,7 @@ public void apply(TacletBuilder tb, Object[] arguments, List paramete public static final AbstractConditionBuilder FINAL = new ConstructorBasedBuilder("final", FinalReferenceCondition.class, SV); public static final AbstractConditionBuilder ENUM_CONST = - new ConstructorBasedBuilder("isEnumConst", EnumConstantCondition.class, SV); + new ConstructorBasedBuilder("isEnumConst", EnumConstantCondition.class, SORT, SV); public static final AbstractConditionBuilder LOCAL_VARIABLE = new ConstructorBasedBuilder("isLocalVariable", LocalVariableCondition.class, SV); public static final AbstractConditionBuilder ARRAY_LENGTH = @@ -260,8 +260,8 @@ public VariableCondition build(Object[] arguments, List parameters, return new TypeCondition((TypeResolver) arguments[0], !negated, non_null); } }; - public static final AbstractConditionBuilder ENUM_TYPE = - new ConstructorBasedBuilder("reference", EnumTypeCondition.class, SV, SV, SV); + // public static final AbstractConditionBuilder ENUM_TYPE = + // new ConstructorBasedBuilder("reference", EnumTypeCondition.class, SV, SV, SV); public static final AbstractConditionBuilder CONTAINS_ASSIGNMENT = new ConstructorBasedBuilder("containsAssignment", ContainsAssignmentCondition.class, SV); public static final AbstractConditionBuilder FIELD_TYPE = @@ -377,7 +377,7 @@ public IsLabeledCondition build(Object[] arguments, List parameters, FREE_3, FREE_4, FINAL_TYPE, FREE_5, NEW_TYPE_OF, NEW_DEPENDING_ON, FREE_LABEL_IN_VARIABLE, DIFFERENT, FINAL, ENUM_CONST, LOCAL_VARIABLE, ARRAY_LENGTH, ARRAY, REFERENCE_ARRAY, MAY_EXPAND_METHOD_2, - MAY_EXPAND_METHOD_3, STATIC_METHOD, THIS_REFERENCE, REFERENCE, ENUM_TYPE, + MAY_EXPAND_METHOD_3, STATIC_METHOD, THIS_REFERENCE, REFERENCE, /* ENUM_TYPE, */ CONTAINS_ASSIGNMENT, FIELD_TYPE, STATIC_REFERENCE, DIFFERENT_FIELDS, SAME_OBSERVER, applyUpdateOnRigid, DROP_EFFECTLESS_ELEMENTARIES, SIMPLIFY_ITE_UPDATE, SUBFORMULAS, STATIC_FIELD, MODEL_FIELD, SUBFORMULA, DROP_EFFECTLESS_STORES, EQUAL_UNIQUE, diff --git a/key.core/src/main/java/de/uka/ilkd/key/rule/conditions/EnumConstantCondition.java b/key.core/src/main/java/de/uka/ilkd/key/rule/conditions/EnumConstantCondition.java index 0b099102d5c..1f71e3e79c8 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/rule/conditions/EnumConstantCondition.java +++ b/key.core/src/main/java/de/uka/ilkd/key/rule/conditions/EnumConstantCondition.java @@ -6,14 +6,20 @@ import de.uka.ilkd.key.java.Services; import de.uka.ilkd.key.java.ast.declaration.EnumClassDeclaration; -import de.uka.ilkd.key.java.ast.reference.FieldReference; -import de.uka.ilkd.key.logic.JTerm; import de.uka.ilkd.key.logic.op.ProgramVariable; +import de.uka.ilkd.key.logic.sort.GenericSort; import de.uka.ilkd.key.rule.VariableConditionAdapter; import de.uka.ilkd.key.rule.inst.SVInstantiations; import org.key_project.logic.SyntaxElement; +import org.key_project.logic.Term; +import org.key_project.logic.op.Function; +import org.key_project.logic.op.Operator; import org.key_project.logic.op.sv.SchemaVariable; +import org.key_project.logic.sort.Sort; +import org.key_project.util.collection.Pair; + +import org.jspecify.annotations.Nullable; /** @@ -22,17 +28,20 @@ * @author mulbrich * @since 2006-12-04 * @version 2006-12-11 + * @version 2025-10-24 Refactored for the "new" heap model. */ public final class EnumConstantCondition extends VariableConditionAdapter { private final SchemaVariable reference; + private final GenericSort typeReference; /** * the static reference condition checks if a suggested instantiation for a schema variable * denotes a reference to an enum constant. */ - public EnumConstantCondition(SchemaVariable reference) { + public EnumConstantCondition(GenericSort typeReference, SchemaVariable reference) { this.reference = reference; + this.typeReference = typeReference; } @@ -41,27 +50,51 @@ public boolean check(SchemaVariable var, SyntaxElement subst, SVInstantiations s Services services) { if (var == reference) { - // new ObjectInspector(var).setVisible(true); - // new ObjectInspector(subst).setVisible(true); - ProgramVariable progvar; - - if (subst instanceof FieldReference) { - progvar = ((FieldReference) subst).getProgramVariable(); - } else if (subst instanceof JTerm && ((JTerm) subst).op() instanceof ProgramVariable) { - progvar = (ProgramVariable) ((JTerm) subst).op(); - } else { + // try to find the enum constant field + @Nullable + Pair field = resolveEnumFieldConstant(subst, services); + if (field == null) return false; - } - - return EnumClassDeclaration.isEnumConstant(progvar); + // if there is such a field, check that its type is the right enum type + KeYJavaType containerType = ((ProgramVariable) field.second).getContainerType(); + Sort typeInst = svInst.getGenericSortInstantiations().getInstantiation(typeReference); + return containerType.getSort() == typeInst; } + return true; } + // also used in EnumConstantValue + public static @Nullable Pair resolveEnumFieldConstant(Object obj, + Services services) { + if (obj instanceof Term term) { + Operator op = term.op(); + if (op instanceof Function func && func.isUnique() + && func.sort() == services.getTypeConverter().getHeapLDT().getFieldSort() + && func.name().toString().contains("::")) { + String funcName = func.name().toString(); + int colon = funcName.indexOf("::$"); + if (colon == -1) { + return null; + } + String sortName = funcName.substring(0, colon); + String fieldName = funcName.substring(colon + 3); + KeYJavaType kjt = services.getJavaInfo().getKeYJavaType(sortName); + if (kjt == null || !(kjt.getJavaType() instanceof EnumClassDeclaration)) { + return null; + } + EnumClassDeclaration ecd = (EnumClassDeclaration) kjt.getJavaType(); + return ecd.getConstant(fieldName); + } + } + return null; + } + + @Override public String toString() { - return "\\enumConstant(" + reference + ")"; + return "\\isEnumConst(" + typeReference + ", " + reference + ")"; } } diff --git a/key.core/src/main/java/de/uka/ilkd/key/rule/conditions/EnumTypeCondition.java b/key.core/src/main/java/de/uka/ilkd/key/rule/conditions/EnumTypeCondition.java index 5902cd8a987..8bb757f64c4 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/rule/conditions/EnumTypeCondition.java +++ b/key.core/src/main/java/de/uka/ilkd/key/rule/conditions/EnumTypeCondition.java @@ -19,9 +19,15 @@ /** * This variable condition checks if a type is an enum type. * + * @deprecated As of 2025, this varcond is no longer needed, its functionality is currently + * handled by {@link EnumConstantCondition} that checks type and constant field in one + * varcond. + * Should be removed soon. + * * @author mulbrich * @since 2006-12-14 */ +@Deprecated public final class EnumTypeCondition extends VariableConditionAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(EnumTypeCondition.class); diff --git a/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/EnumConstantValue.java b/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/EnumConstantValue.java index a6031d61158..9b1e0f0636f 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/EnumConstantValue.java +++ b/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/EnumConstantValue.java @@ -3,23 +3,23 @@ * SPDX-License-Identifier: GPL-2.0-only */ package de.uka.ilkd.key.rule.metaconstruct; -import de.uka.ilkd.key.java.KeYJavaASTFactory; import de.uka.ilkd.key.java.Services; -import de.uka.ilkd.key.java.ast.declaration.EnumClassDeclaration; -import de.uka.ilkd.key.java.ast.expression.literal.IntLiteral; import de.uka.ilkd.key.logic.JTerm; import de.uka.ilkd.key.logic.op.AbstractTermTransformer; -import de.uka.ilkd.key.logic.op.ProgramVariable; +import de.uka.ilkd.key.logic.op.IProgramVariable; +import de.uka.ilkd.key.rule.conditions.EnumConstantCondition; import de.uka.ilkd.key.rule.inst.SVInstantiations; import org.key_project.logic.Name; -import org.key_project.logic.op.Operator; +import org.key_project.util.collection.Pair; + +import org.jspecify.annotations.Nullable; /** * resolve a program variable to an integer literal. * - * If the PV is a enum constant, its index in the enum constant array is returned. If the PC is a - * reference to the nextToCreate field than the number of enum constants is returned. + * If the PV is a enum constant field constant, its index in the enum constant array is returned. + * This is the ordinal of the enum constant. * * @author mulbrich */ @@ -39,33 +39,16 @@ public EnumConstantValue() { */ public JTerm transform(JTerm term, SVInstantiations svInst, Services services) { term = term.sub(0); - Operator op = term.op(); - - if (op instanceof ProgramVariable pv) { - int value; - - // String varname = pv.getProgramElementName().getProgramName(); - - if (false) {// varname.endsWith(ImplicitFieldAdder.IMPLICIT_NEXT_TO_CREATE)) {//TODO - // - if (pv.getContainerType().getJavaType() instanceof EnumClassDeclaration ecd) { - value = ecd.getNumberOfConstants(); - } else { - throw new IllegalArgumentException(term + " is not in an enum type."); - } - } else { - // enum constant - value = EnumClassDeclaration.indexOf(pv); - if (value == -1) { - throw new IllegalArgumentException(term + " is not an enum constant"); - } - } - final IntLiteral valueLiteral = KeYJavaASTFactory.intLiteral(value); - term = services.getTypeConverter().convertToLogicElement(valueLiteral); + @Nullable + Pair enConst = + EnumConstantCondition.resolveEnumFieldConstant(term, services); + if (enConst == null) { + return term; } - return term; + int ordinal = enConst.first; + return services.getTermBuilder().zTerm(ordinal); } } diff --git a/key.core/src/main/resources/de/uka/ilkd/key/java/JavaRedux/java/lang/Enum.java b/key.core/src/main/resources/de/uka/ilkd/key/java/JavaRedux/java/lang/Enum.java index 2f822fc942a..7e26e6449c7 100644 --- a/key.core/src/main/resources/de/uka/ilkd/key/java/JavaRedux/java/lang/Enum.java +++ b/key.core/src/main/resources/de/uka/ilkd/key/java/JavaRedux/java/lang/Enum.java @@ -5,9 +5,13 @@ public abstract class Enum extends java.lang.Object implements java.lang.Comparable, java.io.Serializable { - public final java.lang.String name(); - public final int ordinal(); + + /*@ public normal_behavior + @ ensures \result == \dl_enumOrdinal(this); + @ assignable \strictly_nothing; + @*/ + public /*@ helper */ final int ordinal(); protected Enum(java.lang.String arg0, int arg1); public final java.lang.Class getDeclaringClass(); public static java.lang.Enum valueOf(java.lang.Class arg0, java.lang.String arg1); diff --git a/key.core/src/main/resources/de/uka/ilkd/key/proof/rules/java5.key b/key.core/src/main/resources/de/uka/ilkd/key/proof/rules/java5.key index 31f6af27de6..7e85a9eb750 100644 --- a/key.core/src/main/resources/de/uka/ilkd/key/proof/rules/java5.key +++ b/key.core/src/main/resources/de/uka/ilkd/key/proof/rules/java5.key @@ -3,10 +3,14 @@ * SPDX-License-Identifier: GPL-2.0-only */ \sorts { - \generic E; + \generic E \extends java.lang.Object; \generic G; } +\functions { + int enumOrdinal(java.lang.Object); +} + \schemaVariables { \modalOperator {diamond, box, diamond_transaction, box_transaction} #allmodal; \program Type #ty; @@ -25,7 +29,8 @@ \formula post, inv; - \term E e; + \term Field e; + \term Field e1, e2; } /*** @@ -72,24 +77,29 @@ *** Enumerations ***/ \rules(programRules:Java) { - /* XXX - enumConstantByIndex { - \assumes(wellFormed(heap) ==>) - \find( e ) - \varcond(\enumConstant(e)) - \replacewith( E::(#enumconstantvalue(e)) ) + enumConstantEq { + \find( E::final(null, e1) = E::final(null, e2) ) + \varcond(\isEnumConst(E, e1), \isEnumConst(E, e2)) + \replacewith( e1 = e2 ) \heuristics(simplify) }; + enumConstantNull { + \find( E::final(null, e) = null ) + \varcond(\isEnumConst(E, e)) + \replacewith( false ) + \heuristics(simplify) + }; enumOrdinalToIndex { - \find( #fieldref(e, "ordinal") ) - \varcond(\isEnumType(E)) - \add(e = E::(#fieldref(e, "ordinal")) ==> ) + \find( enumOrdinal(E::final(null, e)) ) + \varcond(\isEnumConst(E, e)) + \replacewith( #enumconstantvalue(e) ) + \heuristics(simplify) }; +} - } - +/* \rules(programRules:Java,initialisation:disableStaticInitialisation) { enumNextToCreateConstant { @@ -111,5 +121,5 @@ \replacewith( #enumconstantvalue(#nc) ) \heuristics(simplify) }; - */ -} + + }*/ diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/sourceview/KeYEditorLexer.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/sourceview/KeYEditorLexer.java index 9d418a39f54..27b00a76fbb 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/sourceview/KeYEditorLexer.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/sourceview/KeYEditorLexer.java @@ -105,8 +105,8 @@ public class KeYEditorLexer implements SourceHighlightDocument.EditorLexer { addAll(KEYWORDS2, MODALOPERATOR, PROGRAM, FORMULA, TERM, UPDATE, VARIABLES, VARIABLE, SKOLEMTERM, SKOLEMFORMULA, TERMLABEL, VARIABLES, VARIABLE, APPLY_UPDATE_ON_RIGID, DEPENDINGON, DISJOINTMODULONULL, DROP_EFFECTLESS_ELEMENTARIES, DROP_EFFECTLESS_STORES, - SIMPLIFY_IF_THEN_ELSE_UPDATE, ENUM_CONST, FREELABELIN, HASSORT, FIELDTYPE, FINAL, - ELEMSORT, HASLABEL, HASSUBFORMULAS, ISARRAY, ISARRAYLENGTH, ISCONSTANT, ISENUMTYPE, + SIMPLIFY_IF_THEN_ELSE_UPDATE, ISENUMCONST, FREELABELIN, HASSORT, FIELDTYPE, FINAL, + ELEMSORT, HASLABEL, HASSUBFORMULAS, ISARRAY, ISARRAYLENGTH, ISCONSTANT, ISINDUCTVAR, ISLOCALVARIABLE, ISOBSERVER, DIFFERENT, METADISJOINT, ISTHISREFERENCE, DIFFERENTFIELDS, ISREFERENCE, ISREFERENCEARRAY, ISSTATICFIELD, ISMODELFIELD, ISINSTRICTFP, ISSUBTYPE, EQUAL_UNIQUE, NEW, NEW_TYPE_OF, NEW_DEPENDING_ON, From f53b6606e750e90613acb463ac62ccc4f690d7c7 Mon Sep 17 00:00:00 2001 From: Mattias Ulbrich Date: Fri, 24 Oct 2025 22:33:48 +0200 Subject: [PATCH 02/10] spotlessing # Conflicts: # key.core/src/main/java/de/uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java # key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/EnumConstantValue.java --- .../uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java b/key.core/src/main/java/de/uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java index 33d653eed97..6a195382e0f 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java +++ b/key.core/src/main/java/de/uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java @@ -11,8 +11,10 @@ import de.uka.ilkd.key.logic.JavaDLFieldNames; import de.uka.ilkd.key.logic.ProgramElementName; import de.uka.ilkd.key.logic.op.IProgramVariable; +import de.uka.ilkd.key.logic.op.ProgramVariable; import org.key_project.util.ExtList; +import org.key_project.util.collection.Pair; import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; From 397ee5404fefac876640aebddbcd7069c28acf60 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Fri, 19 Jun 2026 21:39:26 +0200 Subject: [PATCH 03/10] fix rebasing --- .../ast/declaration/EnumClassDeclaration.java | 49 +++++++++---------- .../conditions/EnumConstantCondition.java | 17 +++---- .../rule/metaconstruct/EnumConstantValue.java | 10 ++-- 3 files changed, 34 insertions(+), 42 deletions(-) diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java b/key.core/src/main/java/de/uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java index 6a195382e0f..6d3b3b77516 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java +++ b/key.core/src/main/java/de/uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java @@ -3,20 +3,21 @@ * SPDX-License-Identifier: GPL-2.0-only */ package de.uka.ilkd.key.java.ast.declaration; -import java.util.HashMap; -import java.util.Map; +import java.util.List; +import java.util.Objects; import de.uka.ilkd.key.java.ast.abstraction.KeYJavaType; import de.uka.ilkd.key.java.ast.abstraction.Type; -import de.uka.ilkd.key.logic.JavaDLFieldNames; import de.uka.ilkd.key.logic.ProgramElementName; import de.uka.ilkd.key.logic.op.IProgramVariable; import de.uka.ilkd.key.logic.op.ProgramVariable; import org.key_project.util.ExtList; -import org.key_project.util.collection.Pair; +import org.key_project.util.collection.ImmutableList; +import org.key_project.util.collection.ImmutableSLList; -import org.jspecify.annotations.NonNull; +import com.github.javaparser.ast.body.EnumConstantDeclaration; +import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; /** @@ -32,15 +33,16 @@ * @author mulbrich * @since 2006-12-10, updated 2025-10-24 by MU */ - +@NullMarked public class EnumClassDeclaration extends ClassDeclaration { + public record EnumEntry(String name, int ordinal, IProgramVariable variable) { + } /** * store the program variables which represent the enum constants * in a lookup map from name to (ordinal index, program variable) */ - private final Map> constants = - new HashMap<>(); + private final ImmutableList constants; /** * create a new EnumClassDeclaration that describes an enum defintion. It merely wraps a @@ -51,18 +53,20 @@ public class EnumClassDeclaration extends ClassDeclaration { * @param isLibrary see class constructor * @param enumConstantDeclarations the declarations for the enum constants */ - // TODO javaparser public EnumClassDeclaration( - ExtList children, ProgramElementName fullName, boolean isLibrary - /* , List enumConstantDeclarations */) { + ExtList children, ProgramElementName fullName, boolean isLibrary, + List enumConstantDeclarations) { super(children, fullName, isLibrary); + ImmutableList seq = ImmutableSLList.nil(); int ordinal = 0; for (EnumConstantDeclaration ecd : enumConstantDeclarations) { - String constName = ecd.getEnumConstantSpecification().getName(); - constants.put(constName, new Pair<>(ordinal, findAttr(constName))); + String constName = ecd.getNameAsString(); + seq = seq.prepend(new EnumEntry(constName, ordinal, findAttr(constName))); ordinal++; } + + constants = seq; } /* @@ -73,11 +77,12 @@ public EnumClassDeclaration( * */ private IProgramVariable findAttr(String fieldName) { - String completeName = getFullName() + JavaDLFieldNames.SEPARATOR + fieldName; + // TODO String completeName = getFullName() + JavaDLFieldNames.SEPARATOR + fieldName; + String completeName = getFullName() + "::" + fieldName; for (int i = 0; i < members.size(); i++) { if (members.get(i) instanceof FieldDeclaration fd) { FieldSpecification fs = fd.getFieldSpecifications().get(0); - if (fs.getName().equals(completeName)) { + if (Objects.equals(fs.getName(), completeName)) { return fs.getProgramVariable(); } } @@ -90,12 +95,7 @@ private IProgramVariable findAttr(String fieldName) { * is pv a enum constant of THIS enum? */ private boolean isLocalEnumConstant(IProgramVariable pv) { - for (IProgramVariable cnst : constants) { - if (cnst.equals(pv)) { - return true; - } - } - return false; + return constants.stream().anyMatch(it -> it.variable.equals(pv)); } /** @@ -107,7 +107,7 @@ private boolean isLocalEnumConstant(IProgramVariable pv) { */ private int localIndexOf(ProgramVariable pv) { for (int i = 0; i < constants.size(); i++) { - if (constants.get(i).equals(pv)) { + if (constants.get(i).variable.equals(pv)) { return i; } } @@ -159,8 +159,7 @@ public static int indexOf(ProgramVariable attribute) { * @return a pair of (index, program variable) of the enum constant with the given name or null * if there is no such constant */ - public @Nullable Pair<@NonNull Integer, @NonNull IProgramVariable> getConstant( - String fieldName) { - return constants.get(fieldName); + public @Nullable EnumEntry getConstant(String fieldName) { + return constants.stream().filter(it -> it.name == fieldName).findAny().orElse(null); } } diff --git a/key.core/src/main/java/de/uka/ilkd/key/rule/conditions/EnumConstantCondition.java b/key.core/src/main/java/de/uka/ilkd/key/rule/conditions/EnumConstantCondition.java index 1f71e3e79c8..7658ee9d698 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/rule/conditions/EnumConstantCondition.java +++ b/key.core/src/main/java/de/uka/ilkd/key/rule/conditions/EnumConstantCondition.java @@ -5,6 +5,7 @@ import de.uka.ilkd.key.java.Services; +import de.uka.ilkd.key.java.ast.abstraction.KeYJavaType; import de.uka.ilkd.key.java.ast.declaration.EnumClassDeclaration; import de.uka.ilkd.key.logic.op.ProgramVariable; import de.uka.ilkd.key.logic.sort.GenericSort; @@ -17,13 +18,10 @@ import org.key_project.logic.op.Operator; import org.key_project.logic.op.sv.SchemaVariable; import org.key_project.logic.sort.Sort; -import org.key_project.util.collection.Pair; - -import org.jspecify.annotations.Nullable; /** - * ensures that the given instantiation for the schemavariable denotes a constant of an enum type. + * ensures that the given instantiation for the schema-variable denotes a constant of an enum type. * * @author mulbrich * @since 2006-12-04 @@ -51,13 +49,12 @@ public boolean check(SchemaVariable var, SyntaxElement subst, SVInstantiations s if (var == reference) { // try to find the enum constant field - @Nullable - Pair field = resolveEnumFieldConstant(subst, services); + EnumClassDeclaration.EnumEntry field = resolveEnumFieldConstant(subst, services); if (field == null) return false; // if there is such a field, check that its type is the right enum type - KeYJavaType containerType = ((ProgramVariable) field.second).getContainerType(); + KeYJavaType containerType = ((ProgramVariable) field.variable()).getContainerType(); Sort typeInst = svInst.getGenericSortInstantiations().getInstantiation(typeReference); return containerType.getSort() == typeInst; } @@ -66,7 +63,7 @@ public boolean check(SchemaVariable var, SyntaxElement subst, SVInstantiations s } // also used in EnumConstantValue - public static @Nullable Pair resolveEnumFieldConstant(Object obj, + public static EnumClassDeclaration.EnumEntry resolveEnumFieldConstant(Object obj, Services services) { if (obj instanceof Term term) { Operator op = term.op(); @@ -81,10 +78,10 @@ public boolean check(SchemaVariable var, SyntaxElement subst, SVInstantiations s String sortName = funcName.substring(0, colon); String fieldName = funcName.substring(colon + 3); KeYJavaType kjt = services.getJavaInfo().getKeYJavaType(sortName); - if (kjt == null || !(kjt.getJavaType() instanceof EnumClassDeclaration)) { + if (kjt == null || !(kjt.getJavaType() instanceof EnumClassDeclaration ecd)) { return null; } - EnumClassDeclaration ecd = (EnumClassDeclaration) kjt.getJavaType(); + return ecd.getConstant(fieldName); } } diff --git a/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/EnumConstantValue.java b/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/EnumConstantValue.java index 9b1e0f0636f..1e0a9882aba 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/EnumConstantValue.java +++ b/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/EnumConstantValue.java @@ -4,16 +4,13 @@ package de.uka.ilkd.key.rule.metaconstruct; import de.uka.ilkd.key.java.Services; +import de.uka.ilkd.key.java.ast.declaration.EnumClassDeclaration; import de.uka.ilkd.key.logic.JTerm; import de.uka.ilkd.key.logic.op.AbstractTermTransformer; -import de.uka.ilkd.key.logic.op.IProgramVariable; import de.uka.ilkd.key.rule.conditions.EnumConstantCondition; import de.uka.ilkd.key.rule.inst.SVInstantiations; import org.key_project.logic.Name; -import org.key_project.util.collection.Pair; - -import org.jspecify.annotations.Nullable; /** * resolve a program variable to an integer literal. @@ -40,14 +37,13 @@ public EnumConstantValue() { public JTerm transform(JTerm term, SVInstantiations svInst, Services services) { term = term.sub(0); - @Nullable - Pair enConst = + EnumClassDeclaration.EnumEntry enConst = EnumConstantCondition.resolveEnumFieldConstant(term, services); if (enConst == null) { return term; } - int ordinal = enConst.first; + int ordinal = enConst.ordinal(); return services.getTermBuilder().zTerm(ordinal); } From 667b4637d6c2d7f32aedd8d50058856a72edc143 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Mon, 29 Jun 2026 01:41:31 +0200 Subject: [PATCH 04/10] merge KeYEditorLexer and LexerHighlighter # Conflicts: # key.ui/src/main/java/de/uka/ilkd/key/gui/IssueDialog.java # key.ui/src/main/java/de/uka/ilkd/key/gui/actions/EditSourceFileAction.java # key.ui/src/main/java/de/uka/ilkd/key/gui/utilities/LexerHighlighter.java --- .../ast/declaration/EnumClassDeclaration.java | 2 +- .../java/de/uka/ilkd/key/gui/IssueDialog.java | 5 +- .../key/gui/actions/EditSourceFileAction.java | 4 +- .../key/gui/sourceview/KeYEditorLexer.java | 156 ----------- .../key/gui/utilities/LexerHighlighter.java | 259 ++++++++++++------ 5 files changed, 187 insertions(+), 239 deletions(-) delete mode 100644 key.ui/src/main/java/de/uka/ilkd/key/gui/sourceview/KeYEditorLexer.java diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java b/key.core/src/main/java/de/uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java index 6d3b3b77516..6a8fb601cb9 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java +++ b/key.core/src/main/java/de/uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java @@ -24,7 +24,7 @@ * This class is used for wrapping an enum into a standard class type. * *

- * In addition the programvariables that represent enum constants are memorized. Thus this class is + * In addition, the programvariables that represent enum constants are memorized. Thus this class is * able to have queries on the enum constants. * * mulbrich: Update 2025 (a mere 19 years later): diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/IssueDialog.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/IssueDialog.java index d561037db4c..dbd58a89f54 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/IssueDialog.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/IssueDialog.java @@ -26,11 +26,11 @@ import de.uka.ilkd.key.gui.actions.SendFeedbackAction; import de.uka.ilkd.key.gui.configuration.Config; import de.uka.ilkd.key.gui.sourceview.JavaJMLEditorLexer; -import de.uka.ilkd.key.gui.sourceview.KeYEditorLexer; import de.uka.ilkd.key.gui.sourceview.SourceHighlightDocument; import de.uka.ilkd.key.gui.sourceview.TextLineNumber; import de.uka.ilkd.key.gui.utilities.ErrorMarkPainter; import de.uka.ilkd.key.gui.utilities.GuiUtilities; +import de.uka.ilkd.key.gui.utilities.LexerHighlighter; import de.uka.ilkd.key.pp.LogicPrinter; import de.uka.ilkd.key.speclang.PositionedString; import de.uka.ilkd.key.speclang.SLEnvInput; @@ -703,7 +703,8 @@ private void updatePreview(PositionedIssueString issue) { if (isJava(uri.getPath())) { showSourceCode(source, new JavaJMLEditorLexer()); } else if (isKeY(uri.getPath())) { - showSourceCode(source, new KeYEditorLexer()); + showSourceCode(source, + new LexerHighlighter.KeYLexerHighlighter().getEditorLexer()); } else { txtSource.setText(source); } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/EditSourceFileAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/EditSourceFileAction.java index 6e5ff9851f2..af50795a3eb 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/EditSourceFileAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/EditSourceFileAction.java @@ -22,10 +22,10 @@ import de.uka.ilkd.key.gui.configuration.Config; import de.uka.ilkd.key.gui.fonticons.IconFactory; import de.uka.ilkd.key.gui.sourceview.JavaJMLEditorLexer; -import de.uka.ilkd.key.gui.sourceview.KeYEditorLexer; import de.uka.ilkd.key.gui.sourceview.SourceHighlightDocument; import de.uka.ilkd.key.gui.sourceview.TextLineNumber; import de.uka.ilkd.key.gui.utilities.CurrentLineHighlighter; +import de.uka.ilkd.key.gui.utilities.LexerHighlighter; import de.uka.ilkd.key.util.ExceptionTools; import org.key_project.util.java.IOUtil; @@ -179,7 +179,7 @@ public void addNotify() { if (file.toString().endsWith(".java")) { lexer = new JavaJMLEditorLexer(); } else if (file.toString().endsWith(".key") || file.toString().endsWith(".proof")) { - lexer = new KeYEditorLexer(); + lexer = new LexerHighlighter.KeYLexerHighlighter().getEditorLexer(); } else { lexer = SourceHighlightDocument.TRIVIAL_LEXER; } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/sourceview/KeYEditorLexer.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/sourceview/KeYEditorLexer.java deleted file mode 100644 index 27b00a76fbb..00000000000 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/sourceview/KeYEditorLexer.java +++ /dev/null @@ -1,156 +0,0 @@ -/* This file is part of KeY - https://key-project.org - * KeY is licensed under the GNU General Public License Version 2 - * SPDX-License-Identifier: GPL-2.0-only */ -package de.uka.ilkd.key.gui.sourceview; - -import java.awt.*; -import java.util.ArrayList; -import java.util.BitSet; -import java.util.List; -import javax.swing.text.SimpleAttributeSet; -import javax.swing.text.StyleConstants; - -import de.uka.ilkd.key.gui.colors.ColorSettings; -import de.uka.ilkd.key.nparser.JavaKeYLexer; - -import org.antlr.v4.runtime.CharStreams; - -import static de.uka.ilkd.key.nparser.JavaKeYLexer.*; - -/** - * This is a lexer class used by a {@link SourceHighlightDocument} to highlight KeY code. - * It uses the ANTLR lexer {@link JavaKeYLexer} to tokenize the text. - * - * Secondary keywords are highlighted in a different color. These are schema variables kinds, - * variable conditions etc. - * - * @author Mattias Ulbrich - */ -public class KeYEditorLexer implements SourceHighlightDocument.EditorLexer { - - /** highight color for KeY keywords (dark red/violet) */ - private static final ColorSettings.ColorProperty KEYWORD_COLOR = - ColorSettings.define("[key]keyword", "", new Color(0x7f0055)); - - /** highight color for secondary KeY keywords (light red/violet) */ - private static final ColorSettings.ColorProperty KEYWORD2_COLOR = - ColorSettings.define("[key]keyword2", "", new Color(0x78526C)); - - /** highight color for comments (dull green) */ - private static final ColorSettings.ColorProperty COMMENT_COLOR = - ColorSettings.define("[key]comment", "", new Color(0x3f7f5f)); - - /** highight color for literals (dark blue) */ - private static final ColorSettings.ColorProperty LITERAL_COLOR = - ColorSettings.define("[key]literal", "", new Color(0x2A75B1)); - - /** highight color for Modalities (dark yellow) */ - private static final ColorSettings.ColorProperty MODALITY_COLOR = - ColorSettings.define("[key]modality", "", new Color(0xC67C13)); - - /** default style */ - private static final SimpleAttributeSet normalStyle = new SimpleAttributeSet(); - - /** the style of keywords */ - private static final SimpleAttributeSet commentStyle = new SimpleAttributeSet(); - - /** the style of keywords */ - private static final SimpleAttributeSet keywordStyle = new SimpleAttributeSet(); - - /** the style of secondary keywords */ - private static final SimpleAttributeSet keyword2Style = new SimpleAttributeSet(); - - /** the style of literals */ - private static final SimpleAttributeSet literalStyle = new SimpleAttributeSet(); - - /** the style of comments and line comments */ - private static final SimpleAttributeSet modalityStyle = new SimpleAttributeSet(); - - /** the token identifiers for keywords */ - private static final BitSet KEYWORDS = new BitSet(); - - /** the token identifiers for secondary keywords */ - private static final BitSet KEYWORDS2 = new BitSet(); - - /** the token identifiers for literals */ - private static final BitSet LITERALS = new BitSet(); - - /** the token identifiers for comments */ - private static final BitSet COMMENTS = new BitSet(); - - /** the token identifiers for modalities */ - private static final BitSet MODALITIES = new BitSet(); - - static { - // set the styles - // StyleConstants.setBold(keywordStyle, true); - StyleConstants.setForeground(keywordStyle, KEYWORD_COLOR.get()); - StyleConstants.setForeground(keyword2Style, KEYWORD2_COLOR.get()); - StyleConstants.setForeground(commentStyle, COMMENT_COLOR.get()); - StyleConstants.setForeground(literalStyle, LITERAL_COLOR.get()); - StyleConstants.setForeground(modalityStyle, MODALITY_COLOR.get()); - - // the following can probably be refined - addAll(KEYWORDS, SORTS, GENERIC, PROXY, EXTENDS, ONEOF, ABSTRACT, SCHEMAVARIABLES, - SCHEMAVAR, MODIFIABLE, PROGRAMVARIABLES, STORE_TERM_IN, STORE_STMT_IN, HAS_INVARIANT, - GET_INVARIANT, GET_FREE_INVARIANT, GET_VARIANT, IS_LABELED, SAME_OBSERVER, VARCOND, - FORALL, EXISTS, SUBST, IF, IFEX, THEN, ELSE, INCLUDE, INCLUDELDTS, CLASSPATH, - BOOTCLASSPATH, NODEFAULTCLASSES, JAVASOURCE, WITHOPTIONS, OPTIONSDECL, KEYSETTINGS, - PROFILE, IGNOREUPDATELEVEL, INSEQUENTSTATE, ANTECEDENTPOLARITY, SUCCEDENTPOLARITY, - CLOSEGOAL, HEURISTICSDECL, NONINTERACTIVE, DISPLAYNAME, HELPTEXT, REPLACEWITH, ADDRULES, - ADDPROGVARS, HEURISTICS, FIND, ADD, ASSUMES, TRIGGER, AVOID, PREDICATES, FUNCTIONS, - DATATYPES, TRANSFORMERS, UNIQUE, FREE, RULES, AXIOMS, PROBLEM, CHOOSECONTRACT, - PROOFOBLIGATION, PROOF, PROOFSCRIPT, CONTRACTS, INVARIANTS, LEMMA, IN_TYPE, - IS_ABSTRACT_OR_INTERFACE, CONTAINERTYPE); - addAll(KEYWORDS2, MODALOPERATOR, PROGRAM, FORMULA, TERM, UPDATE, VARIABLES, VARIABLE, - SKOLEMTERM, SKOLEMFORMULA, TERMLABEL, VARIABLES, VARIABLE, APPLY_UPDATE_ON_RIGID, - DEPENDINGON, DISJOINTMODULONULL, DROP_EFFECTLESS_ELEMENTARIES, DROP_EFFECTLESS_STORES, - SIMPLIFY_IF_THEN_ELSE_UPDATE, ISENUMCONST, FREELABELIN, HASSORT, FIELDTYPE, FINAL, - ELEMSORT, HASLABEL, HASSUBFORMULAS, ISARRAY, ISARRAYLENGTH, ISCONSTANT, - ISINDUCTVAR, ISLOCALVARIABLE, ISOBSERVER, DIFFERENT, METADISJOINT, ISTHISREFERENCE, - DIFFERENTFIELDS, ISREFERENCE, ISREFERENCEARRAY, ISSTATICFIELD, ISMODELFIELD, - ISINSTRICTFP, ISSUBTYPE, EQUAL_UNIQUE, NEW, NEW_TYPE_OF, NEW_DEPENDING_ON, - NEW_LOCAL_VARS, HAS_ELEMENTARY_SORT, NEWLABEL, CONTAINS_ASSIGNMENT, NOT_, NOTFREEIN, - SAME, STATIC, STATICMETHODREFERENCE, MAXEXPANDMETHOD, STRICT, TYPEOF, - INSTANTIATE_GENERIC); - addAll(LITERALS, STRING_LITERAL, HEX_LITERAL, INT_LITERAL, FLOAT_LITERAL, DOUBLE_LITERAL, - REAL_LITERAL, TRUE, FALSE); - addAll(COMMENTS, DOC_COMMENT, ML_COMMENT, SL_COMMENT); - addAll(MODALITIES, MODALITY); - } - - private static void addAll(BitSet bitSet, int... values) { - for (int value : values) { - bitSet.set(value); - } - } - - private SimpleAttributeSet getAttributes(int type) { - if (KEYWORDS.get(type)) { - return keywordStyle; - } else if (KEYWORDS2.get(type)) { - return keyword2Style; - } else if (LITERALS.get(type)) { - return literalStyle; - } else if (COMMENTS.get(type)) { - return commentStyle; - } else if (MODALITIES.get(type)) { - return modalityStyle; - } else { - return normalStyle; - } - } - - @Override - public List applyTo(String text) { - JavaKeYLexer keYLexer = new JavaKeYLexer(CharStreams.fromString(text)); - List result = new ArrayList<>(); - var t = keYLexer.nextToken(); - while (t.getType() != -1) { - result.add(new SourceHighlightDocument.Token(t.getText().length(), - getAttributes(t.getType()))); - t = keYLexer.nextToken(); - } - return result; - } -} diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/utilities/LexerHighlighter.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/utilities/LexerHighlighter.java index a7d001b2040..5b61dd174e4 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/utilities/LexerHighlighter.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/utilities/LexerHighlighter.java @@ -4,12 +4,17 @@ package de.uka.ilkd.key.gui.utilities; import java.awt.*; +import java.util.ArrayList; +import java.util.BitSet; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.*; import javax.swing.text.*; import de.uka.ilkd.key.gui.colors.ColorSettings; +import de.uka.ilkd.key.gui.sourceview.SourceHighlightDocument; +import de.uka.ilkd.key.nparser.JavaKeYLexer; import de.uka.ilkd.key.nparser.ParsingFacade; import org.antlr.v4.runtime.CharStreams; @@ -27,9 +32,16 @@ */ @NullMarked public abstract class LexerHighlighter { + private final StyleContext styleContext = new StyleContext(); + + /// Get the style regarding the `tokenType` of the {@link Token} protected abstract @Nullable AttributeSet getStyle(int tokenType); - private final StyleContext styleContext = new StyleContext(); + /// Length of the Markdown language prefix in code blocks. + protected abstract int getPatternPrefixLength(); + + /// The regular expression to find code blocks + protected abstract Pattern getMarkdownPattern(); protected AttributeSet define(Color fgColor, boolean bold, boolean italic) { AttributeSet aset = @@ -61,8 +73,6 @@ public final void highlightPaneMarkdown(JTextPane contentPane) { contentPane.repaint(); } - protected abstract int getPatternPrefixLength(); - public final void highlightPaneAll(JTextPane contentPane, int startIdx, int stopIdx) { String text = contentPane.getText(); @@ -87,7 +97,6 @@ public final void highlightPaneAll(JTextPane contentPane) { highlightPaneAll(contentPane, 0, -1); } - private void highlightToken(StyledDocument sd, int startIdx, Token tok) { var attribute = getStyle(tok.getType()); if (attribute != null) { @@ -97,104 +106,198 @@ private void highlightToken(StyledDocument sd, int startIdx, Token tok) { } } - protected abstract Pattern getMarkdownPattern(); + public SourceHighlightDocument.EditorLexer getEditorLexer() { + return text -> { + JavaKeYLexer keYLexer = new JavaKeYLexer(CharStreams.fromString(text)); + List result = new ArrayList<>(); + var t = keYLexer.nextToken(); + while (t.getType() != -1) { + result.add(new SourceHighlightDocument.Token(t.getText().length(), + getStyle(t.getType()))); + t = keYLexer.nextToken(); + } + return result; + }; + } public static class KeYLexerHighlighter extends LexerHighlighter { - public static final ColorSettings.ColorProperty COLOR_KEYWORD = - ColorSettings.define("infotree.syntax.keyword", "", Color.BLUE, Color.ORANGE); + + /** + * highlight color for KeY keywords (dark red/violet) + */ + private static final ColorSettings.ColorProperty COLOR_KEYWORD = + ColorSettings.define("syntax.key.keyword", "highlight color for KeY keywords ", + new Color(0x7f0055)); + + /** + * highlight color for secondary KeY keywords (light red/violet) + */ + private static final ColorSettings.ColorProperty COLOR_KEYWORD2 = + ColorSettings.define("syntax.key.keyword2", + "highlight color for secondary KeY keywords", new Color(0x78526C)); + + /** + * highlight color for comments (dull green) + */ + private static final ColorSettings.ColorProperty COLOR_COMMENT = + ColorSettings.define("syntax.key.comment", "highlight color for comments", + new Color(0xafafaf)); + + private static final ColorSettings.ColorProperty COLOR_COMMENT_DOC = + ColorSettings.define("syntax.key.comment", "highlight color for documentation comments", + new Color(0x3f7f5f)); + + /** + * highlight color for literals (dark blue) + */ + private static final ColorSettings.ColorProperty COLOR_LITERALS = + ColorSettings.define("syntax.key.literal", "highlight color for literals", + new Color(0x2A75B1)); + + /** + * highlight color for Modalities (dark yellow) + */ + private static final ColorSettings.ColorProperty COLOR_MODALITY = + ColorSettings.define("syntax.key.modality", "highlight color for Modalities", + new Color(0xC67C13)); public static final ColorSettings.ColorProperty COLOR_IDENTIFIER = ColorSettings.define("infotree.syntax.identifier", "", Color.BLACK, Color.WHITE); - public static final ColorSettings.ColorProperty COLOR_COMMENT = - ColorSettings.define("infotree.syntax.comment", "", Color.GREEN, Color.GREEN); - public static final ColorSettings.ColorProperty COLOR_OPERATORS = ColorSettings.define("infotree.syntax.operators", "", Color.BLACK, Color.ORANGE); public static final ColorSettings.ColorProperty COLOR_ERROR = ColorSettings.define("infotree.syntax.error", "", Color.RED, Color.WHITE); - public static final ColorSettings.ColorProperty COLOR_LITERALS = - ColorSettings.define("infotree.syntax.literals", "", Color.GREEN, Color.GREEN); - - public static final ColorSettings.ColorProperty COLOR_MODALITY = - ColorSettings.define("infotree.syntax.modality", "", Color.PINK, Color.PINK); - private final AttributeSet STYLE_OPERATORS = define(COLOR_OPERATORS.get(), false, false); private final AttributeSet STYLE_ERROR = define(COLOR_ERROR.get(), false, false); private final AttributeSet STYLE_LITERALS = define(COLOR_LITERALS.get(), false, true); private final AttributeSet STYLE_KEYWORDS = define(COLOR_KEYWORD.get(), true, false); + private final AttributeSet STYLE_KEYWORDS2 = define(COLOR_KEYWORD2.get(), false, false); private final AttributeSet STYLE_IDENTIFIER = define(COLOR_IDENTIFIER.get(), true, false); private final AttributeSet STYLE_COMMENT = define(COLOR_COMMENT.get(), false, true); + private final AttributeSet STYLE_COMMENT2 = define(COLOR_COMMENT_DOC.get(), false, true); private final AttributeSet STYLE_MODALITY = define(COLOR_MODALITY.get(), false, true); private final AttributeSet STYLE_DEFAULT = define(COLOR_IDENTIFIER.get(), false, false); + private final BitSet KEYWORDS = new BitSet(); + private final BitSet KEYWORDS2 = new BitSet(); + private final BitSet LITERALS = new BitSet(); + private final BitSet COMMENTS = new BitSet(); + private final BitSet COMMENTS2 = new BitSet(); + private final BitSet MODALITIES = new BitSet(); + private final BitSet IDENTIFIERS = new BitSet(); + private final BitSet ERROR = new BitSet(); + private final BitSet OPERATORS = new BitSet(); + + public KeYLexerHighlighter() { + // the following can probably be refined + addAll(KEYWORDS, SORTS, GENERIC, PROXY, EXTENDS, ONEOF, ABSTRACT, SCHEMAVARIABLES, + SCHEMAVAR, MODIFIABLE, PROGRAMVARIABLES, STORE_TERM_IN, STORE_STMT_IN, + HAS_INVARIANT, + GET_INVARIANT, GET_FREE_INVARIANT, GET_VARIANT, IS_LABELED, SAME_OBSERVER, VARCOND, + FORALL, EXISTS, SUBST, IF, IFEX, THEN, ELSE, INCLUDE, INCLUDELDTS, CLASSPATH, + BOOTCLASSPATH, NODEFAULTCLASSES, JAVASOURCE, WITHOPTIONS, OPTIONSDECL, KEYSETTINGS, + PROFILE, SAMEUPDATELEVEL, INSEQUENTSTATE, ANTECEDENTPOLARITY, SUCCEDENTPOLARITY, + CLOSEGOAL, HEURISTICSDECL, NONINTERACTIVE, DISPLAYNAME, HELPTEXT, REPLACEWITH, + ADDRULES, + ADDPROGVARS, HEURISTICS, FIND, ADD, ASSUMES, TRIGGER, AVOID, PREDICATES, FUNCTIONS, + DATATYPES, TRANSFORMERS, UNIQUE, FREE, RULES, AXIOMS, PROBLEM, CHOOSECONTRACT, + PROOFOBLIGATION, PROOF, PROOFSCRIPT, CONTRACTS, INVARIANTS, LEMMA, IN_TYPE, + IS_ABSTRACT_OR_INTERFACE, CONTAINERTYPE, + TERMLABEL, MODIFIABLE, PROGRAMVARIABLES, STORE_TERM_IN, STORE_STMT_IN, + HAS_INVARIANT, GET_FREE_INVARIANT, GET_VARIANT, + IS_LABELED, SAME_OBSERVER, VARCOND, APPLY_UPDATE_ON_RIGID, + DEPENDINGON, DISJOINTMODULONULL, DROP_EFFECTLESS_ELEMENTARIES, + DROP_EFFECTLESS_STORES, SIMPLIFY_IF_THEN_ELSE_UPDATE, ENUM_CONST, + FREELABELIN, HASSORT, FIELDTYPE, FINAL, ELEMSORT, HASLABEL, + HASSUBFORMULAS, ISARRAY, ISARRAYLENGTH, ISCONSTANT, ISENUMTYPE, + ISINDUCTVAR, ISLOCALVARIABLE, ISOBSERVER, DIFFERENT, METADISJOINT, + ISTHISREFERENCE, DIFFERENTFIELDS, ISREFERENCE, ISREFERENCEARRAY, + ISSTATICFIELD, ISMODELFIELD, ISINSTRICTFP, ISSUBTYPE, EQUAL_UNIQUE, + NEW, NEW_TYPE_OF, NEW_DEPENDING_ON, NEW_LOCAL_VARS, HAS_ELEMENTARY_SORT, + NEWLABEL, CONTAINS_ASSIGNMENT, NOT_, NOTFREEIN, SAME, STATIC, + STATICMETHODREFERENCE, MAXEXPANDMETHOD, STRICT, TYPEOF, INSTANTIATE_GENERIC, + FORALL, EXISTS, SUBST, IF, IFEX, THEN, ELSE, INCLUDE, + INCLUDELDTS, CLASSPATH, BOOTCLASSPATH, NODEFAULTCLASSES, JAVASOURCE, + WITHOPTIONS, OPTIONSDECL, KEYSETTINGS, PROFILE, + IGNOREUPDATELEVEL, INSEQUENTSTATE, ANTECEDENTPOLARITY, SUCCEDENTPOLARITY, + CLOSEGOAL, HEURISTICSDECL, NONINTERACTIVE, DISPLAYNAME, + HELPTEXT, REPLACEWITH, ADDRULES, ADDPROGVARS, HEURISTICS, + FIND, ADD, ASSUMES, TRIGGER, AVOID, PREDICATES, + FUNCTIONS, DATATYPES, TRANSFORMERS, UNIQUE, FREE, + RULES, AXIOMS, PROBLEM, CHOOSECONTRACT, PROOFOBLIGATION, + PROOF, PROOFSCRIPT, CONTRACTS, INVARIANTS, LEMMA, + IN_TYPE, IS_ABSTRACT_OR_INTERFACE, IS_FINAL, CONTAINERTYPE, + SCHEMAVAR, FORMULA, MODALITYD, MODALITYB, + MODALITYBB, MODAILITYGENERIC1, MODAILITYGENERIC2, MODAILITYGENERIC3, + MODAILITYGENERIC4, MODAILITYGENERIC5, MODAILITYGENERIC6, MODAILITYGENERIC7, + MODALITYD_END, MODALITYD_STRING, MODALITYD_CHAR, MODALITYG_END, + MODALITYB_END, MODALITYBB_END, PROGRAM); + addAll(KEYWORDS2, MODALOPERATOR, PROGRAM, FORMULA, TERM, UPDATE, VARIABLES, VARIABLE, + SKOLEMTERM, SKOLEMFORMULA, TERMLABEL, VARIABLES, VARIABLE, APPLY_UPDATE_ON_RIGID, + DEPENDINGON, DISJOINTMODULONULL, DROP_EFFECTLESS_ELEMENTARIES, + DROP_EFFECTLESS_STORES, + SIMPLIFY_IF_THEN_ELSE_UPDATE, ISENUMCONST, FREELABELIN, HASSORT, FIELDTYPE, FINAL, + ELEMSORT, HASLABEL, HASSUBFORMULAS, ISARRAY, ISARRAYLENGTH, ISCONSTANT, + ISINDUCTVAR, ISLOCALVARIABLE, ISOBSERVER, DIFFERENT, METADISJOINT, ISTHISREFERENCE, + DIFFERENTFIELDS, ISREFERENCE, ISREFERENCEARRAY, ISSTATICFIELD, ISMODELFIELD, + ISINSTRICTFP, ISSUBTYPE, EQUAL_UNIQUE, NEW, NEW_TYPE_OF, NEW_DEPENDING_ON, + NEW_LOCAL_VARS, HAS_ELEMENTARY_SORT, NEWLABEL, CONTAINS_ASSIGNMENT, NOT_, NOTFREEIN, + SAME, STATIC, STATICMETHODREFERENCE, MAXEXPANDMETHOD, STRICT, TYPEOF, + INSTANTIATE_GENERIC); + addAll(OPERATORS, AT, PARALLEL, OR, AND, NOT, IMP, + EQUALS, NOT_EQUALS, SEQARROW, EXP, TILDE, PERCENT, + STAR, MINUS, PLUS, GREATER, GREATEREQUAL, + LESS, LESSEQUAL, LGUILLEMETS, RGUILLEMETS, EQV, + UTF_PRECEDES, UTF_IN, UTF_EMPTY, UTF_UNION, UTF_INTERSECT, + UTF_SUBSET_EQ, UTF_SUBSEQ, UTF_SETMINUS, SEMI, SLASH, + COLON, DOUBLECOLON, ASSIGN, DOT, DOTRANGE, COMMA, + LPAREN, RPAREN, LBRACE, RBRACE, LBRACKET, RBRACKET, + EMPTYBRACKETS); + addAll(ERROR, ERROR_UKNOWN_ESCAPE, ERROR_CHAR); + addAll(IDENTIFIERS, IDENT); + addAll(LITERALS, + CHAR_LITERAL, QUOTED_STRING_LITERAL, TRUE, FALSE, + STRING_LITERAL, BIN_LITERAL, HEX_LITERAL, INT_LITERAL, FLOAT_LITERAL, + DOUBLE_LITERAL, REAL_LITERAL); + addAll(COMMENTS2, DOC_COMMENT); + addAll(COMMENTS, ML_COMMENT, SL_COMMENT, COMMENT_END); + addAll(MODALITIES, MODALITY); + } + + private static void addAll(BitSet bitSet, int... values) { + for (int value : values) { + bitSet.set(value); + } + } + @Override - protected @Nullable AttributeSet getStyle(int tokType) { - return switch (tokType) { - case TERMLABEL, MODIFIABLE, PROGRAMVARIABLES, STORE_TERM_IN, STORE_STMT_IN, - HAS_INVARIANT, GET_FREE_INVARIANT, GET_VARIANT, - IS_LABELED, SAME_OBSERVER, VARCOND, APPLY_UPDATE_ON_RIGID, - DEPENDINGON, DISJOINTMODULONULL, DROP_EFFECTLESS_ELEMENTARIES, - DROP_EFFECTLESS_STORES, SIMPLIFY_IF_THEN_ELSE_UPDATE, ENUM_CONST, - FREELABELIN, HASSORT, FIELDTYPE, FINAL, ELEMSORT, HASLABEL, - HASSUBFORMULAS, ISARRAY, ISARRAYLENGTH, ISCONSTANT, ISENUMTYPE, - ISINDUCTVAR, ISLOCALVARIABLE, ISOBSERVER, DIFFERENT, METADISJOINT, - ISTHISREFERENCE, DIFFERENTFIELDS, ISREFERENCE, ISREFERENCEARRAY, - ISSTATICFIELD, ISMODELFIELD, ISINSTRICTFP, ISSUBTYPE, EQUAL_UNIQUE, - NEW, NEW_TYPE_OF, NEW_DEPENDING_ON, NEW_LOCAL_VARS, HAS_ELEMENTARY_SORT, - NEWLABEL, CONTAINS_ASSIGNMENT, NOT_, NOTFREEIN, SAME, STATIC, - STATICMETHODREFERENCE, MAXEXPANDMETHOD, STRICT, TYPEOF, INSTANTIATE_GENERIC, - FORALL, EXISTS, SUBST, IF, IFEX, THEN, ELSE, INCLUDE, - INCLUDELDTS, CLASSPATH, BOOTCLASSPATH, NODEFAULTCLASSES, JAVASOURCE, - WITHOPTIONS, OPTIONSDECL, KEYSETTINGS, PROFILE, - IGNOREUPDATELEVEL, INSEQUENTSTATE, ANTECEDENTPOLARITY, SUCCEDENTPOLARITY, - CLOSEGOAL, HEURISTICSDECL, NONINTERACTIVE, DISPLAYNAME, - HELPTEXT, REPLACEWITH, ADDRULES, ADDPROGVARS, HEURISTICS, - FIND, ADD, ASSUMES, TRIGGER, AVOID, PREDICATES, - FUNCTIONS, DATATYPES, TRANSFORMERS, UNIQUE, FREE, - RULES, AXIOMS, PROBLEM, CHOOSECONTRACT, PROOFOBLIGATION, - PROOF, PROOFSCRIPT, CONTRACTS, INVARIANTS, LEMMA, - IN_TYPE, IS_ABSTRACT_OR_INTERFACE, IS_FINAL, CONTAINERTYPE, - SCHEMAVAR, FORMULA, - COMMENT_END, DOC_COMMENT, ML_COMMENT, MODALITYD, MODALITYB, - MODALITYBB, MODAILITYGENERIC1, MODAILITYGENERIC2, MODAILITYGENERIC3, - MODAILITYGENERIC4, MODAILITYGENERIC5, MODAILITYGENERIC6, MODAILITYGENERIC7, - MODALITYD_END, MODALITYD_STRING, MODALITYD_CHAR, MODALITYG_END, - MODALITYB_END, MODALITYBB_END, MODALOPERATOR, PROGRAM -> - STYLE_KEYWORDS; - - case MODALITY -> STYLE_MODALITY; - - case AT, PARALLEL, OR, AND, NOT, IMP, - EQUALS, NOT_EQUALS, SEQARROW, EXP, TILDE, PERCENT, - STAR, MINUS, PLUS, GREATER, GREATEREQUAL, - LESS, LESSEQUAL, LGUILLEMETS, RGUILLEMETS, EQV, - UTF_PRECEDES, UTF_IN, UTF_EMPTY, UTF_UNION, UTF_INTERSECT, - UTF_SUBSET_EQ, UTF_SUBSEQ, UTF_SETMINUS, SEMI, SLASH, - COLON, DOUBLECOLON, ASSIGN, DOT, DOTRANGE, COMMA, - LPAREN, RPAREN, LBRACE, RBRACE, LBRACKET, RBRACKET, - EMPTYBRACKETS -> - STYLE_OPERATORS; - case ERROR_UKNOWN_ESCAPE, ERROR_CHAR -> STYLE_ERROR; - case IDENT -> STYLE_IDENTIFIER; - // 'COMMENT' is a lexer *mode*, not a token type; mode and token ids share one int - // space, so as a case label it aliases whatever token has the same id -- a - // duplicate - // case label once the modality lexer modes renumbered things (#3867). It was a dead - // no-op anyway: single-line comments are SL_COMMENT (here); a whole '/* ... */' / - // '/*! ... */' is emitted as COMMENT_END / DOC_COMMENT (currently grouped with the - // keywords above; ML_COMMENT is a 'more' rule and never a token). - case SL_COMMENT -> STYLE_COMMENT; - case CHAR_LITERAL, QUOTED_STRING_LITERAL, TRUE, FALSE, - STRING_LITERAL, BIN_LITERAL, HEX_LITERAL, INT_LITERAL, FLOAT_LITERAL, - DOUBLE_LITERAL, REAL_LITERAL -> - STYLE_LITERALS; - default -> STYLE_DEFAULT; - }; + protected @Nullable AttributeSet getStyle(int type) { + if (KEYWORDS.get(type)) { + return STYLE_KEYWORDS; + } else if (KEYWORDS2.get(type)) { + return STYLE_KEYWORDS2; + } else if (LITERALS.get(type)) { + return STYLE_LITERALS; + } else if (COMMENTS2.get(type)) { + return STYLE_COMMENT2; + } else if (COMMENTS.get(type)) { + return STYLE_COMMENT; + } else if (ERROR.get(type)) { + return STYLE_ERROR; + } else if (IDENTIFIERS.get(type)) { + return STYLE_IDENTIFIER; + } else if (OPERATORS.get(type)) { + return STYLE_OPERATORS; + } else if (MODALITIES.get(type)) { + return STYLE_MODALITY; + } else { + return STYLE_DEFAULT; + } } @Override From 6d59565b54f48500900b59ba857e12dc88a7682c Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Mon, 29 Jun 2026 01:50:19 +0200 Subject: [PATCH 05/10] moved enumOrdinal function so it is found during JML parsing --- .../src/main/resources/de/uka/ilkd/key/proof/rules/java5.key | 1 - .../main/resources/de/uka/ilkd/key/proof/rules/javaHeader.key | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/key.core/src/main/resources/de/uka/ilkd/key/proof/rules/java5.key b/key.core/src/main/resources/de/uka/ilkd/key/proof/rules/java5.key index 7e85a9eb750..1ffd4327054 100644 --- a/key.core/src/main/resources/de/uka/ilkd/key/proof/rules/java5.key +++ b/key.core/src/main/resources/de/uka/ilkd/key/proof/rules/java5.key @@ -8,7 +8,6 @@ } \functions { - int enumOrdinal(java.lang.Object); } \schemaVariables { diff --git a/key.core/src/main/resources/de/uka/ilkd/key/proof/rules/javaHeader.key b/key.core/src/main/resources/de/uka/ilkd/key/proof/rules/javaHeader.key index e64cdd45bc4..5bc7ccca6ac 100644 --- a/key.core/src/main/resources/de/uka/ilkd/key/proof/rules/javaHeader.key +++ b/key.core/src/main/resources/de/uka/ilkd/key/proof/rules/javaHeader.key @@ -34,4 +34,6 @@ /*! A boolean function which is true iff the dynamic type of its argument is a subtype of the type which is part of the function name. */ boolean instance(any); + + int enumOrdinal(java.lang.Object); } From 71e92776c288d8aafda5a4c3e41e1decdf005750 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Sat, 22 Aug 2026 20:44:31 +0200 Subject: [PATCH 06/10] spotless --- .../java/de/uka/ilkd/key/gui/utilities/LexerHighlighter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/utilities/LexerHighlighter.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/utilities/LexerHighlighter.java index 5b61dd174e4..9079ec15841 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/utilities/LexerHighlighter.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/utilities/LexerHighlighter.java @@ -223,7 +223,7 @@ public KeYLexerHighlighter() { FORALL, EXISTS, SUBST, IF, IFEX, THEN, ELSE, INCLUDE, INCLUDELDTS, CLASSPATH, BOOTCLASSPATH, NODEFAULTCLASSES, JAVASOURCE, WITHOPTIONS, OPTIONSDECL, KEYSETTINGS, PROFILE, - IGNOREUPDATELEVEL, INSEQUENTSTATE, ANTECEDENTPOLARITY, SUCCEDENTPOLARITY, + IGNOREUPDATELEVEL, INSEQUENTSTATE, ANTECEDENTPOLARITY, SUCCEDENTPOLARITY, CLOSEGOAL, HEURISTICSDECL, NONINTERACTIVE, DISPLAYNAME, HELPTEXT, REPLACEWITH, ADDRULES, ADDPROGVARS, HEURISTICS, FIND, ADD, ASSUMES, TRIGGER, AVOID, PREDICATES, From 7a28014923aa84726f521b1a1d0e2ffd07d3a38e Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Sat, 22 Aug 2026 20:45:24 +0200 Subject: [PATCH 07/10] Fix compile error --- .../ilkd/key/java/ast/declaration/EnumClassDeclaration.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java b/key.core/src/main/java/de/uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java index 6a8fb601cb9..af52b73217f 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java +++ b/key.core/src/main/java/de/uka/ilkd/key/java/ast/declaration/EnumClassDeclaration.java @@ -14,7 +14,6 @@ import org.key_project.util.ExtList; import org.key_project.util.collection.ImmutableList; -import org.key_project.util.collection.ImmutableSLList; import com.github.javaparser.ast.body.EnumConstantDeclaration; import org.jspecify.annotations.NullMarked; @@ -58,7 +57,7 @@ public EnumClassDeclaration( List enumConstantDeclarations) { super(children, fullName, isLibrary); - ImmutableList seq = ImmutableSLList.nil(); + ImmutableList seq = ImmutableList.nil(); int ordinal = 0; for (EnumConstantDeclaration ecd : enumConstantDeclarations) { String constName = ecd.getNameAsString(); From e27cad9b9b888a82e35a63a832ae6f8ffd13138f Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Sat, 22 Aug 2026 22:25:44 +0200 Subject: [PATCH 08/10] better Enum support --- .../01_TextblockTransformer/SimpleEnum.java | 4 + .../02_MultiCatchReducer/SimpleEnum.java | 4 + .../03_TryWithResourceReducer/SimpleEnum.java | 4 + .../SimpleEnum.java | 4 + .../05_EnumClassBuilder/SimpleEnum.java | 42 ++++ .../06_RecordClassBuilder/SimpleEnum.java | 42 ++++ .../07_JMLTransformer/SimpleEnum.java | 42 ++++ .../expected/08_JmlDocRemoval/SimpleEnum.java | 42 ++++ .../09_ImplicitFieldAdder/SimpleEnum.java | 60 ++++++ .../SimpleEnum.java | 62 ++++++ .../SimpleEnum.java | 70 ++++++ .../SimpleEnum.java | 73 +++++++ .../SimpleEnum.java | 111 ++++++++++ .../14_PrepareObjectBuilder/SimpleEnum.java | 119 +++++++++++ .../expected/15_CreateBuilder/SimpleEnum.java | 126 +++++++++++ .../16_CreateObjectBuilder/SimpleEnum.java | 134 ++++++++++++ .../SimpleEnum.java | 134 ++++++++++++ .../SimpleEnum.java | 134 ++++++++++++ .../pipelineTests/enums/input/SimpleEnum.java | 3 + .../java/transformations/KeYJavaPipeline.java | 1 + .../pipeline/EnumClassAccessExplicit.java | 35 +++ .../pipeline/EnumClassBuilder.java | 199 +++++++++++++++++- .../pipeline/EnumClassDeclaration.java | 183 ---------------- .../de/uka/ilkd/key/proof/rules/java5.key | 6 +- .../pipeline}/KeyJavaPipelineTest.java | 10 +- key.ui/examples/Java/Enums/README.txt | 8 + key.ui/examples/Java/Enums/project.key | 3 + key.ui/examples/Java/Enums/src/Checker.java | 25 +++ key.ui/examples/index/samplesIndex.txt | 1 + 29 files changed, 1486 insertions(+), 195 deletions(-) create mode 100644 key.core/pipelineTests/enums/expected/01_TextblockTransformer/SimpleEnum.java create mode 100644 key.core/pipelineTests/enums/expected/02_MultiCatchReducer/SimpleEnum.java create mode 100644 key.core/pipelineTests/enums/expected/03_TryWithResourceReducer/SimpleEnum.java create mode 100644 key.core/pipelineTests/enums/expected/04_EnumClassAccessExplicit/SimpleEnum.java create mode 100644 key.core/pipelineTests/enums/expected/05_EnumClassBuilder/SimpleEnum.java create mode 100644 key.core/pipelineTests/enums/expected/06_RecordClassBuilder/SimpleEnum.java create mode 100644 key.core/pipelineTests/enums/expected/07_JMLTransformer/SimpleEnum.java create mode 100644 key.core/pipelineTests/enums/expected/08_JmlDocRemoval/SimpleEnum.java create mode 100644 key.core/pipelineTests/enums/expected/09_ImplicitFieldAdder/SimpleEnum.java create mode 100644 key.core/pipelineTests/enums/expected/10_InstanceAllocationMethodBuilder/SimpleEnum.java create mode 100644 key.core/pipelineTests/enums/expected/11_ConstructorNormalformBuilder/SimpleEnum.java create mode 100644 key.core/pipelineTests/enums/expected/12_ClassPreparationMethodBuilder/SimpleEnum.java create mode 100644 key.core/pipelineTests/enums/expected/13_ClassInitializeMethodBuilder/SimpleEnum.java create mode 100644 key.core/pipelineTests/enums/expected/14_PrepareObjectBuilder/SimpleEnum.java create mode 100644 key.core/pipelineTests/enums/expected/15_CreateBuilder/SimpleEnum.java create mode 100644 key.core/pipelineTests/enums/expected/16_CreateObjectBuilder/SimpleEnum.java create mode 100644 key.core/pipelineTests/enums/expected/17_LocalClassTransformation/SimpleEnum.java create mode 100644 key.core/pipelineTests/enums/expected/18_ConstantStringExpressionEvaluator/SimpleEnum.java create mode 100644 key.core/pipelineTests/enums/input/SimpleEnum.java create mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/transformations/pipeline/EnumClassAccessExplicit.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/transformations/pipeline/EnumClassDeclaration.java rename key.core/src/test/java/{ => de/uka/ilkd/key/java/transformations/pipeline}/KeyJavaPipelineTest.java (96%) create mode 100644 key.ui/examples/Java/Enums/README.txt create mode 100644 key.ui/examples/Java/Enums/project.key create mode 100644 key.ui/examples/Java/Enums/src/Checker.java diff --git a/key.core/pipelineTests/enums/expected/01_TextblockTransformer/SimpleEnum.java b/key.core/pipelineTests/enums/expected/01_TextblockTransformer/SimpleEnum.java new file mode 100644 index 00000000000..0bf4c8a7cb1 --- /dev/null +++ b/key.core/pipelineTests/enums/expected/01_TextblockTransformer/SimpleEnum.java @@ -0,0 +1,4 @@ +public enum SimpleEnum { + + A, B, C +} diff --git a/key.core/pipelineTests/enums/expected/02_MultiCatchReducer/SimpleEnum.java b/key.core/pipelineTests/enums/expected/02_MultiCatchReducer/SimpleEnum.java new file mode 100644 index 00000000000..0bf4c8a7cb1 --- /dev/null +++ b/key.core/pipelineTests/enums/expected/02_MultiCatchReducer/SimpleEnum.java @@ -0,0 +1,4 @@ +public enum SimpleEnum { + + A, B, C +} diff --git a/key.core/pipelineTests/enums/expected/03_TryWithResourceReducer/SimpleEnum.java b/key.core/pipelineTests/enums/expected/03_TryWithResourceReducer/SimpleEnum.java new file mode 100644 index 00000000000..0bf4c8a7cb1 --- /dev/null +++ b/key.core/pipelineTests/enums/expected/03_TryWithResourceReducer/SimpleEnum.java @@ -0,0 +1,4 @@ +public enum SimpleEnum { + + A, B, C +} diff --git a/key.core/pipelineTests/enums/expected/04_EnumClassAccessExplicit/SimpleEnum.java b/key.core/pipelineTests/enums/expected/04_EnumClassAccessExplicit/SimpleEnum.java new file mode 100644 index 00000000000..0bf4c8a7cb1 --- /dev/null +++ b/key.core/pipelineTests/enums/expected/04_EnumClassAccessExplicit/SimpleEnum.java @@ -0,0 +1,4 @@ +public enum SimpleEnum { + + A, B, C +} diff --git a/key.core/pipelineTests/enums/expected/05_EnumClassBuilder/SimpleEnum.java b/key.core/pipelineTests/enums/expected/05_EnumClassBuilder/SimpleEnum.java new file mode 100644 index 00000000000..b37506129a9 --- /dev/null +++ b/key.core/pipelineTests/enums/expected/05_EnumClassBuilder/SimpleEnum.java @@ -0,0 +1,42 @@ +public final class SimpleEnum extends Enum { + //@ static invariant A == null && B == null && C == null; + //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); + + public static final SimpleEnum A = new SimpleEnum(); + + public static final SimpleEnum B = new SimpleEnum(); + + public static final SimpleEnum C = new SimpleEnum(); + + private static final String[] $enumConstantNames = { "A", "B", "C" }; + + private static final SimpleEnum[] values = { A, B, C }; + + public static void values() { + return values; + } + + public static SimpleEnum valueOf(String name) { + if ("A".equals(name)) + return A; + if ("B".equals(name)) + return B; + if ("C".equals(name)) + return C; + throw new IllegalArgumentException(); + } + + public String name() { + return $enumConstantNames[ordinal()]; + } + + public int ordinal() { + if (this == A) + return 0; + if (this == B) + return 1; + if (this == C) + return 2; + return 0; + } +} diff --git a/key.core/pipelineTests/enums/expected/06_RecordClassBuilder/SimpleEnum.java b/key.core/pipelineTests/enums/expected/06_RecordClassBuilder/SimpleEnum.java new file mode 100644 index 00000000000..b37506129a9 --- /dev/null +++ b/key.core/pipelineTests/enums/expected/06_RecordClassBuilder/SimpleEnum.java @@ -0,0 +1,42 @@ +public final class SimpleEnum extends Enum { + //@ static invariant A == null && B == null && C == null; + //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); + + public static final SimpleEnum A = new SimpleEnum(); + + public static final SimpleEnum B = new SimpleEnum(); + + public static final SimpleEnum C = new SimpleEnum(); + + private static final String[] $enumConstantNames = { "A", "B", "C" }; + + private static final SimpleEnum[] values = { A, B, C }; + + public static void values() { + return values; + } + + public static SimpleEnum valueOf(String name) { + if ("A".equals(name)) + return A; + if ("B".equals(name)) + return B; + if ("C".equals(name)) + return C; + throw new IllegalArgumentException(); + } + + public String name() { + return $enumConstantNames[ordinal()]; + } + + public int ordinal() { + if (this == A) + return 0; + if (this == B) + return 1; + if (this == C) + return 2; + return 0; + } +} diff --git a/key.core/pipelineTests/enums/expected/07_JMLTransformer/SimpleEnum.java b/key.core/pipelineTests/enums/expected/07_JMLTransformer/SimpleEnum.java new file mode 100644 index 00000000000..b37506129a9 --- /dev/null +++ b/key.core/pipelineTests/enums/expected/07_JMLTransformer/SimpleEnum.java @@ -0,0 +1,42 @@ +public final class SimpleEnum extends Enum { + //@ static invariant A == null && B == null && C == null; + //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); + + public static final SimpleEnum A = new SimpleEnum(); + + public static final SimpleEnum B = new SimpleEnum(); + + public static final SimpleEnum C = new SimpleEnum(); + + private static final String[] $enumConstantNames = { "A", "B", "C" }; + + private static final SimpleEnum[] values = { A, B, C }; + + public static void values() { + return values; + } + + public static SimpleEnum valueOf(String name) { + if ("A".equals(name)) + return A; + if ("B".equals(name)) + return B; + if ("C".equals(name)) + return C; + throw new IllegalArgumentException(); + } + + public String name() { + return $enumConstantNames[ordinal()]; + } + + public int ordinal() { + if (this == A) + return 0; + if (this == B) + return 1; + if (this == C) + return 2; + return 0; + } +} diff --git a/key.core/pipelineTests/enums/expected/08_JmlDocRemoval/SimpleEnum.java b/key.core/pipelineTests/enums/expected/08_JmlDocRemoval/SimpleEnum.java new file mode 100644 index 00000000000..b37506129a9 --- /dev/null +++ b/key.core/pipelineTests/enums/expected/08_JmlDocRemoval/SimpleEnum.java @@ -0,0 +1,42 @@ +public final class SimpleEnum extends Enum { + //@ static invariant A == null && B == null && C == null; + //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); + + public static final SimpleEnum A = new SimpleEnum(); + + public static final SimpleEnum B = new SimpleEnum(); + + public static final SimpleEnum C = new SimpleEnum(); + + private static final String[] $enumConstantNames = { "A", "B", "C" }; + + private static final SimpleEnum[] values = { A, B, C }; + + public static void values() { + return values; + } + + public static SimpleEnum valueOf(String name) { + if ("A".equals(name)) + return A; + if ("B".equals(name)) + return B; + if ("C".equals(name)) + return C; + throw new IllegalArgumentException(); + } + + public String name() { + return $enumConstantNames[ordinal()]; + } + + public int ordinal() { + if (this == A) + return 0; + if (this == B) + return 1; + if (this == C) + return 2; + return 0; + } +} diff --git a/key.core/pipelineTests/enums/expected/09_ImplicitFieldAdder/SimpleEnum.java b/key.core/pipelineTests/enums/expected/09_ImplicitFieldAdder/SimpleEnum.java new file mode 100644 index 00000000000..a685592b494 --- /dev/null +++ b/key.core/pipelineTests/enums/expected/09_ImplicitFieldAdder/SimpleEnum.java @@ -0,0 +1,60 @@ +public final class SimpleEnum extends Enum { + //@ static invariant A == null && B == null && C == null; + //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); + + public static final SimpleEnum A = new SimpleEnum(); + + public static final SimpleEnum B = new SimpleEnum(); + + public static final SimpleEnum C = new SimpleEnum(); + + private static final String[] $enumConstantNames = { "A", "B", "C" }; + + private static final SimpleEnum[] values = { A, B, C }; + + public static void values() { + return values; + } + + public static SimpleEnum valueOf(String name) { + if ("A".equals(name)) + return A; + if ("B".equals(name)) + return B; + if ("C".equals(name)) + return C; + throw new IllegalArgumentException(); + } + + public String name() { + return $enumConstantNames[ordinal()]; + } + + public int ordinal() { + if (this == A) + return 0; + if (this == B) + return 1; + if (this == C) + return 2; + return 0; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; +} diff --git a/key.core/pipelineTests/enums/expected/10_InstanceAllocationMethodBuilder/SimpleEnum.java b/key.core/pipelineTests/enums/expected/10_InstanceAllocationMethodBuilder/SimpleEnum.java new file mode 100644 index 00000000000..564f3d19745 --- /dev/null +++ b/key.core/pipelineTests/enums/expected/10_InstanceAllocationMethodBuilder/SimpleEnum.java @@ -0,0 +1,62 @@ +public final class SimpleEnum extends Enum { + //@ static invariant A == null && B == null && C == null; + //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); + + public static final SimpleEnum A = new SimpleEnum(); + + public static final SimpleEnum B = new SimpleEnum(); + + public static final SimpleEnum C = new SimpleEnum(); + + private static final String[] $enumConstantNames = { "A", "B", "C" }; + + private static final SimpleEnum[] values = { A, B, C }; + + public static void values() { + return values; + } + + public static SimpleEnum valueOf(String name) { + if ("A".equals(name)) + return A; + if ("B".equals(name)) + return B; + if ("C".equals(name)) + return C; + throw new IllegalArgumentException(); + } + + public String name() { + return $enumConstantNames[ordinal()]; + } + + public int ordinal() { + if (this == A) + return 0; + if (this == B) + return 1; + if (this == C) + return 2; + return 0; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SimpleEnum $allocate(); +} diff --git a/key.core/pipelineTests/enums/expected/11_ConstructorNormalformBuilder/SimpleEnum.java b/key.core/pipelineTests/enums/expected/11_ConstructorNormalformBuilder/SimpleEnum.java new file mode 100644 index 00000000000..16de398524d --- /dev/null +++ b/key.core/pipelineTests/enums/expected/11_ConstructorNormalformBuilder/SimpleEnum.java @@ -0,0 +1,70 @@ +public final class SimpleEnum extends Enum { + //@ static invariant A == null && B == null && C == null; + //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); + + public static final SimpleEnum A = new SimpleEnum(); + + public static final SimpleEnum B = new SimpleEnum(); + + public static final SimpleEnum C = new SimpleEnum(); + + private static final String[] $enumConstantNames = { "A", "B", "C" }; + + private static final SimpleEnum[] values = { A, B, C }; + + public static void values() { + return values; + } + + public static SimpleEnum valueOf(String name) { + if ("A".equals(name)) + return A; + if ("B".equals(name)) + return B; + if ("C".equals(name)) + return C; + throw new IllegalArgumentException(); + } + + public String name() { + return $enumConstantNames[ordinal()]; + } + + public int ordinal() { + if (this == A) + return 0; + if (this == B) + return 1; + if (this == C) + return 2; + return 0; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SimpleEnum $allocate(); + + public SimpleEnum() { + } + + public void $init() { + super.$init(); + super.$init(); + } +} diff --git a/key.core/pipelineTests/enums/expected/12_ClassPreparationMethodBuilder/SimpleEnum.java b/key.core/pipelineTests/enums/expected/12_ClassPreparationMethodBuilder/SimpleEnum.java new file mode 100644 index 00000000000..98b2aa4a8a8 --- /dev/null +++ b/key.core/pipelineTests/enums/expected/12_ClassPreparationMethodBuilder/SimpleEnum.java @@ -0,0 +1,73 @@ +public final class SimpleEnum extends Enum { + //@ static invariant A == null && B == null && C == null; + //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); + + public static final SimpleEnum A = new SimpleEnum(); + + public static final SimpleEnum B = new SimpleEnum(); + + public static final SimpleEnum C = new SimpleEnum(); + + private static final String[] $enumConstantNames = { "A", "B", "C" }; + + private static final SimpleEnum[] values = { A, B, C }; + + public static void values() { + return values; + } + + public static SimpleEnum valueOf(String name) { + if ("A".equals(name)) + return A; + if ("B".equals(name)) + return B; + if ("C".equals(name)) + return C; + throw new IllegalArgumentException(); + } + + public String name() { + return $enumConstantNames[ordinal()]; + } + + public int ordinal() { + if (this == A) + return 0; + if (this == B) + return 1; + if (this == C) + return 2; + return 0; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SimpleEnum $allocate(); + + public SimpleEnum() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } +} diff --git a/key.core/pipelineTests/enums/expected/13_ClassInitializeMethodBuilder/SimpleEnum.java b/key.core/pipelineTests/enums/expected/13_ClassInitializeMethodBuilder/SimpleEnum.java new file mode 100644 index 00000000000..2a26ce78e55 --- /dev/null +++ b/key.core/pipelineTests/enums/expected/13_ClassInitializeMethodBuilder/SimpleEnum.java @@ -0,0 +1,111 @@ +public final class SimpleEnum extends Enum { + //@ static invariant A == null && B == null && C == null; + //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); + + public static final SimpleEnum A = new SimpleEnum(); + + public static final SimpleEnum B = new SimpleEnum(); + + public static final SimpleEnum C = new SimpleEnum(); + + private static final String[] $enumConstantNames = { "A", "B", "C" }; + + private static final SimpleEnum[] values = { A, B, C }; + + public static void values() { + return values; + } + + public static SimpleEnum valueOf(String name) { + if ("A".equals(name)) + return A; + if ("B".equals(name)) + return B; + if ("C".equals(name)) + return C; + throw new IllegalArgumentException(); + } + + public String name() { + return $enumConstantNames[ordinal()]; + } + + public int ordinal() { + if (this == A) + return 0; + if (this == B) + return 1; + if (this == C) + return 2; + return 0; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SimpleEnum $allocate(); + + public SimpleEnum() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Enum.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } +} diff --git a/key.core/pipelineTests/enums/expected/14_PrepareObjectBuilder/SimpleEnum.java b/key.core/pipelineTests/enums/expected/14_PrepareObjectBuilder/SimpleEnum.java new file mode 100644 index 00000000000..0f92b49eaf7 --- /dev/null +++ b/key.core/pipelineTests/enums/expected/14_PrepareObjectBuilder/SimpleEnum.java @@ -0,0 +1,119 @@ +public final class SimpleEnum extends Enum { + //@ static invariant A == null && B == null && C == null; + //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); + + public static final SimpleEnum A = new SimpleEnum(); + + public static final SimpleEnum B = new SimpleEnum(); + + public static final SimpleEnum C = new SimpleEnum(); + + private static final String[] $enumConstantNames = { "A", "B", "C" }; + + private static final SimpleEnum[] values = { A, B, C }; + + public static void values() { + return values; + } + + public static SimpleEnum valueOf(String name) { + if ("A".equals(name)) + return A; + if ("B".equals(name)) + return B; + if ("C".equals(name)) + return C; + throw new IllegalArgumentException(); + } + + public String name() { + return $enumConstantNames[ordinal()]; + } + + public int ordinal() { + if (this == A) + return 0; + if (this == B) + return 1; + if (this == C) + return 2; + return 0; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SimpleEnum $allocate(); + + public SimpleEnum() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Enum.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + } + + private void $prepareEnter() { + super.$prepare(); + } +} diff --git a/key.core/pipelineTests/enums/expected/15_CreateBuilder/SimpleEnum.java b/key.core/pipelineTests/enums/expected/15_CreateBuilder/SimpleEnum.java new file mode 100644 index 00000000000..e780b71f9e2 --- /dev/null +++ b/key.core/pipelineTests/enums/expected/15_CreateBuilder/SimpleEnum.java @@ -0,0 +1,126 @@ +public final class SimpleEnum extends Enum { + //@ static invariant A == null && B == null && C == null; + //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); + + public static final SimpleEnum A = new SimpleEnum(); + + public static final SimpleEnum B = new SimpleEnum(); + + public static final SimpleEnum C = new SimpleEnum(); + + private static final String[] $enumConstantNames = { "A", "B", "C" }; + + private static final SimpleEnum[] values = { A, B, C }; + + public static void values() { + return values; + } + + public static SimpleEnum valueOf(String name) { + if ("A".equals(name)) + return A; + if ("B".equals(name)) + return B; + if ("C".equals(name)) + return C; + throw new IllegalArgumentException(); + } + + public String name() { + return $enumConstantNames[ordinal()]; + } + + public int ordinal() { + if (this == A) + return 0; + if (this == B) + return 1; + if (this == C) + return 2; + return 0; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SimpleEnum $allocate(); + + public SimpleEnum() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Enum.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + } + + private void $prepareEnter() { + super.$prepare(); + } + + public SimpleEnum $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } +} diff --git a/key.core/pipelineTests/enums/expected/16_CreateObjectBuilder/SimpleEnum.java b/key.core/pipelineTests/enums/expected/16_CreateObjectBuilder/SimpleEnum.java new file mode 100644 index 00000000000..c72e2eb5a64 --- /dev/null +++ b/key.core/pipelineTests/enums/expected/16_CreateObjectBuilder/SimpleEnum.java @@ -0,0 +1,134 @@ +public final class SimpleEnum extends Enum { + //@ static invariant A == null && B == null && C == null; + //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); + + public static final SimpleEnum A = new SimpleEnum(); + + public static final SimpleEnum B = new SimpleEnum(); + + public static final SimpleEnum C = new SimpleEnum(); + + private static final String[] $enumConstantNames = { "A", "B", "C" }; + + private static final SimpleEnum[] values = { A, B, C }; + + public static void values() { + return values; + } + + public static SimpleEnum valueOf(String name) { + if ("A".equals(name)) + return A; + if ("B".equals(name)) + return B; + if ("C".equals(name)) + return C; + throw new IllegalArgumentException(); + } + + public String name() { + return $enumConstantNames[ordinal()]; + } + + public int ordinal() { + if (this == A) + return 0; + if (this == B) + return 1; + if (this == C) + return 2; + return 0; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SimpleEnum $allocate(); + + public SimpleEnum() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Enum.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + } + + private void $prepareEnter() { + super.$prepare(); + } + + public SimpleEnum $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static SimpleEnum $createObject() { + SimpleEnum __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = SimpleEnum.$allocate(); + __NEW__.$create()@SimpleEnum + return __NEW__; + } +} diff --git a/key.core/pipelineTests/enums/expected/17_LocalClassTransformation/SimpleEnum.java b/key.core/pipelineTests/enums/expected/17_LocalClassTransformation/SimpleEnum.java new file mode 100644 index 00000000000..c72e2eb5a64 --- /dev/null +++ b/key.core/pipelineTests/enums/expected/17_LocalClassTransformation/SimpleEnum.java @@ -0,0 +1,134 @@ +public final class SimpleEnum extends Enum { + //@ static invariant A == null && B == null && C == null; + //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); + + public static final SimpleEnum A = new SimpleEnum(); + + public static final SimpleEnum B = new SimpleEnum(); + + public static final SimpleEnum C = new SimpleEnum(); + + private static final String[] $enumConstantNames = { "A", "B", "C" }; + + private static final SimpleEnum[] values = { A, B, C }; + + public static void values() { + return values; + } + + public static SimpleEnum valueOf(String name) { + if ("A".equals(name)) + return A; + if ("B".equals(name)) + return B; + if ("C".equals(name)) + return C; + throw new IllegalArgumentException(); + } + + public String name() { + return $enumConstantNames[ordinal()]; + } + + public int ordinal() { + if (this == A) + return 0; + if (this == B) + return 1; + if (this == C) + return 2; + return 0; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SimpleEnum $allocate(); + + public SimpleEnum() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Enum.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + } + + private void $prepareEnter() { + super.$prepare(); + } + + public SimpleEnum $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static SimpleEnum $createObject() { + SimpleEnum __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = SimpleEnum.$allocate(); + __NEW__.$create()@SimpleEnum + return __NEW__; + } +} diff --git a/key.core/pipelineTests/enums/expected/18_ConstantStringExpressionEvaluator/SimpleEnum.java b/key.core/pipelineTests/enums/expected/18_ConstantStringExpressionEvaluator/SimpleEnum.java new file mode 100644 index 00000000000..c72e2eb5a64 --- /dev/null +++ b/key.core/pipelineTests/enums/expected/18_ConstantStringExpressionEvaluator/SimpleEnum.java @@ -0,0 +1,134 @@ +public final class SimpleEnum extends Enum { + //@ static invariant A == null && B == null && C == null; + //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); + + public static final SimpleEnum A = new SimpleEnum(); + + public static final SimpleEnum B = new SimpleEnum(); + + public static final SimpleEnum C = new SimpleEnum(); + + private static final String[] $enumConstantNames = { "A", "B", "C" }; + + private static final SimpleEnum[] values = { A, B, C }; + + public static void values() { + return values; + } + + public static SimpleEnum valueOf(String name) { + if ("A".equals(name)) + return A; + if ("B".equals(name)) + return B; + if ("C".equals(name)) + return C; + throw new IllegalArgumentException(); + } + + public String name() { + return $enumConstantNames[ordinal()]; + } + + public int ordinal() { + if (this == A) + return 0; + if (this == B) + return 1; + if (this == C) + return 2; + return 0; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SimpleEnum $allocate(); + + public SimpleEnum() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Enum.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + } + + private void $prepareEnter() { + super.$prepare(); + } + + public SimpleEnum $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static SimpleEnum $createObject() { + SimpleEnum __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = SimpleEnum.$allocate(); + __NEW__.$create()@SimpleEnum + return __NEW__; + } +} diff --git a/key.core/pipelineTests/enums/input/SimpleEnum.java b/key.core/pipelineTests/enums/input/SimpleEnum.java new file mode 100644 index 00000000000..0e1602ae4db --- /dev/null +++ b/key.core/pipelineTests/enums/input/SimpleEnum.java @@ -0,0 +1,3 @@ +public enum SimpleEnum { + A,B,C; +} \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/transformations/KeYJavaPipeline.java b/key.core/src/main/java/de/uka/ilkd/key/java/transformations/KeYJavaPipeline.java index cf90a5109b2..f4503fd6be0 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/java/transformations/KeYJavaPipeline.java +++ b/key.core/src/main/java/de/uka/ilkd/key/java/transformations/KeYJavaPipeline.java @@ -41,6 +41,7 @@ public static KeYJavaPipeline createDefault(TransformationPipelineServices pipel p.add(new TextblockTransformer()); p.add(new MultiCatchReducer()); p.add(new TryWithResourceReducer()); + p.add(new EnumClassAccessExplicit(pipelineServices)); p.add(new EnumClassBuilder(pipelineServices)); p.add(new RecordClassBuilder(pipelineServices)); p.add(new JMLTransformer(pipelineServices)); diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/transformations/pipeline/EnumClassAccessExplicit.java b/key.core/src/main/java/de/uka/ilkd/key/java/transformations/pipeline/EnumClassAccessExplicit.java new file mode 100644 index 00000000000..8427e5c5d01 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/java/transformations/pipeline/EnumClassAccessExplicit.java @@ -0,0 +1,35 @@ +/* This file is part of KeY - https://key-project.org + * KeY is licensed under the GNU General Public License Version 2 + * SPDX-License-Identifier: GPL-2.0-only */ +package de.uka.ilkd.key.java.transformations.pipeline; + +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.body.EnumDeclaration; +import com.github.javaparser.ast.expr.*; +import com.github.javaparser.ast.stmt.SwitchEntry; +import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserEnumConstantDeclaration; + +import static com.github.javaparser.ast.Modifier.DefaultKeyword.*; + +/// This transformation is made to transform any found [EnumDeclaration] into a corresponding +/// [EnumClassDeclaration]. +/// +/// @author mulbrich, drodt +/// @version 2026-03-03 +/// @since 2006-11-20 +public class EnumClassAccessExplicit extends JavaTransformerAbstract { + public EnumClassAccessExplicit(TransformationPipelineServices pipelineServices) { + super(pipelineServices); + } + + @Override + public void apply(CompilationUnit cu) { + cu.walk(NameExpr.class, it -> { + if (it.getParentNode().isPresent() && it.getParentNode().get() instanceof SwitchEntry + && it.resolve() instanceof JavaParserEnumConstantDeclaration ed) { + it.replace( + new FieldAccessExpr(new NameExpr(ed.getType().toString()), ed.getName())); + } + }); + } +} diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/transformations/pipeline/EnumClassBuilder.java b/key.core/src/main/java/de/uka/ilkd/key/java/transformations/pipeline/EnumClassBuilder.java index 13a0b353371..b080f76fb40 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/java/transformations/pipeline/EnumClassBuilder.java +++ b/key.core/src/main/java/de/uka/ilkd/key/java/transformations/pipeline/EnumClassBuilder.java @@ -5,23 +5,35 @@ import java.util.LinkedHashMap; import java.util.Map; +import java.util.stream.Collectors; import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.NodeList; +import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; +import com.github.javaparser.ast.body.EnumConstantDeclaration; import com.github.javaparser.ast.body.EnumDeclaration; -import com.github.javaparser.ast.expr.FieldAccessExpr; -import com.github.javaparser.ast.expr.NameExpr; +import com.github.javaparser.ast.expr.*; +import com.github.javaparser.ast.nodeTypes.NodeWithSimpleName; +import com.github.javaparser.ast.stmt.BlockStmt; +import com.github.javaparser.ast.stmt.IfStmt; +import com.github.javaparser.ast.stmt.ReturnStmt; import com.github.javaparser.ast.stmt.SwitchEntry; +import com.github.javaparser.ast.type.ArrayType; +import com.github.javaparser.ast.type.ClassOrInterfaceType; +import com.github.javaparser.ast.type.PrimitiveType; import com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserEnumConstantDeclaration; +import static com.github.javaparser.ast.Modifier.DefaultKeyword.*; + /// This transformation is made to transform any found [EnumDeclaration] into a corresponding -/// [EnumClassDeclaration]. +/// [ClassOrInterfaceDeclaration]. /// /// @author mulbrich, drodt -/// @since 2006-11-20 /// @version 2026-03-03 +/// @since 2006-11-20 public class EnumClassBuilder extends JavaTransformerAbstract { /// a mapping of enums to the newly created class declarations. - final Map substitutes = new LinkedHashMap<>(); + final Map substitutes = new LinkedHashMap<>(); public EnumClassBuilder(TransformationPipelineServices pipelineServices) { super(pipelineServices); @@ -30,7 +42,8 @@ public EnumClassBuilder(TransformationPipelineServices pipelineServices) { @Override public void apply(CompilationUnit cu) { cu.walk(EnumDeclaration.class, it -> { - substitutes.put(it, new EnumClassDeclaration(it)); + it.replace(createEnumClassEquivalent(it)); + substitutes.put(it, createEnumClassEquivalent(it)); }); cu.walk(NameExpr.class, it -> { if (it.getParentNode().isPresent() && it.getParentNode().get() instanceof SwitchEntry @@ -43,4 +56,178 @@ public void apply(CompilationUnit cu) { e.getKey().replace(e.getValue()); } } + + /// name of the static variable of the array holding the names of the constants. + private static final String ENUM_NAMES = "$enumConstantNames"; + + ClassOrInterfaceDeclaration createEnumClassEquivalent(EnumDeclaration declaration) { + // clone once! + var ed = declaration.clone(); + + var cu = new ClassOrInterfaceDeclaration(); + cu.setName(ed.getName()); + cu.setModifiers(ed.getModifiers()); + + if (!cu.hasModifier(FINAL)) { + // enum is always final + cu.addModifier(FINAL); + } + + if (declaration.isNestedType() && !cu.hasModifier(STATIC)) { + // enum is always final + cu.addModifier(STATIC); + } + + ed.getComment().ifPresent(cu::setComment); + cu.addExtendedType(Enum.class); + cu.setImplementedTypes(ed.getImplementedTypes()); + + for (var e : ed.entries()) { + makeConstantField(cu, e); + } + + cu.getMembers().addAll(ed.getMembers()); + addFieldEnumNames(cu, declaration); + addFieldEnumValues(cu, declaration); + addMethodValues(cu, declaration); + addMethodValueOf(cu, declaration); + addMethodName(cu, declaration); + addMethodOrdinal(cu, declaration); + + addNonnullInvariant(cu, declaration); + addDisjointInvariant(cu, declaration); + addAdtInvariant(cu, declaration); + + return cu; + } + + private void addDisjointInvariant(ClassOrInterfaceDeclaration cu, EnumDeclaration declaration) { + var consts = declaration.getEntries().stream() + .map(NodeWithSimpleName::getNameAsString).toList(); + for (var a : consts) { + for (var b : consts) { + if (a == b) + continue; + services.attachTypeSpec(cu, "static invariant %s != %s;".formatted(a, b)); + } + } + } + + private void addNonnullInvariant(ClassOrInterfaceDeclaration cu, EnumDeclaration declaration) { + var constNonNull = declaration.getEntries().stream() + .map(NodeWithSimpleName::getNameAsString) + .map("%s != null"::formatted) + .collect(Collectors.joining(" && ")); + services.attachTypeSpec(cu, "static invariant %s;".formatted(constNonNull)); + } + + private void addAdtInvariant(ClassOrInterfaceDeclaration cu, EnumDeclaration declaration) { + var constNonNull = declaration.getEntries().stream() + .map(NodeWithSimpleName::getNameAsString) + .map("%s == x"::formatted) + .collect(Collectors.joining(" || ")); + services.attachTypeSpec(cu, "static invariant (\\forall %s x; %s);".formatted( + cu.getNameAsString(), constNonNull)); + } + + /** + * get all declared enum constants for this enum. return them as a list. + * + * @return a list of the enum constants, not null + *

+ * public List getEnumConstantDeclarations() { + * return enumConstants; + * } + */ + private void makeConstantField(ClassOrInterfaceDeclaration cu, EnumConstantDeclaration e) { + var args = e.arguments(); + final var type = new ClassOrInterfaceType(null, cu.getNameAsString()); + var init = new ObjectCreationExpr(null, type.clone(), args); + var field = cu.addField(type, e.name().getIdentifier(), PUBLIC, STATIC, FINAL); + field.getVariables().getFirst().setInitializer(init); + } + + private void addFieldEnumNames(ClassOrInterfaceDeclaration target, EnumDeclaration source) { + var init = new ArrayInitializerExpr(); + for (var ec : source.getEntries()) { + init.values().add(new StringLiteralExpr(ec.getNameAsString())); + } + var field = target.addField(String[].class, ENUM_NAMES, PRIVATE, STATIC, FINAL); + field.getVariables().getFirst().setInitializer(init); + } + + private void addFieldEnumValues(ClassOrInterfaceDeclaration target, EnumDeclaration source) { + var init = new ArrayInitializerExpr(); + for (var ec : source.getEntries()) { + init.values().add(ec.getNameAsExpression()); + } + final var type = new ClassOrInterfaceType(null, target.getNameAsString()); + final var arrayType = new ArrayType(type); + var field = target.addField(arrayType, "values", PRIVATE, STATIC, FINAL); + field.getVariables().getFirst().setInitializer(init); + } + + + /// `public static #E[] values() { return new #E { #consts }; }` + private void addMethodValues(ClassOrInterfaceDeclaration target, EnumDeclaration source) { + var consts = + source.getEntries().stream().map(EnumConstantDeclaration::getNameAsExpression).toList(); + var method = target.addMethod("values", PUBLIC, STATIC); + final var type = new ClassOrInterfaceType(null, target.getNameAsString()); + final var arrayType = new ArrayType(type); + method.getBody().get().addStatement(new ReturnStmt(new NameExpr("values"))); + } + + private void addMethodValueOf(ClassOrInterfaceDeclaration target, EnumDeclaration source) { + // public static #E valueOf(String string) { for (#E e : values()) { if + // (e.name().equals(string)) return e; } throw new IllegalArgumentException(); } + var mtd = target.addMethod("valueOf", PUBLIC, STATIC); + + mtd.setType(new ClassOrInterfaceType(null, target.getNameAsString())); + mtd.addParameter(String.class, "name"); + BlockStmt body = new BlockStmt(); + for (var entry : source.getEntries()) { + var equality = callEquals(strLiteral(entry.getNameAsString()), new NameExpr("name")); + var ifStmt = new IfStmt(equality, new ReturnStmt(entry.getNameAsExpression()), null); + body.addAndGetStatement(ifStmt); + } + + body.addStatement("throw new IllegalArgumentException();"); + mtd.setBody(body); + } + + /// `public String name() { return $enumConstantNames[ordinal()]; }` + private void addMethodName(ClassOrInterfaceDeclaration target, EnumDeclaration source) { + var method = target.addMethod("name", PUBLIC); + method.setType(String.class); + method.getBody().get() + .addStatement(new ReturnStmt(new ArrayAccessExpr(new NameExpr(ENUM_NAMES), + new MethodCallExpr("ordinal")))); + } + + /// `public int ordinal() { if(this==A) return 0; ... if(this==Z) return 26; return 0; }` + private void addMethodOrdinal(ClassOrInterfaceDeclaration target, EnumDeclaration source) { + var method = target.addMethod("ordinal", PUBLIC); + method.setType(new PrimitiveType(PrimitiveType.Primitive.INT)); + NodeList entries = source.getEntries(); + for (int i = 0, entriesSize = entries.size(); i < entriesSize; i++) { + var entry = entries.get(i); + var equality = new BinaryExpr(new ThisExpr(), entry.getNameAsExpression(), + BinaryExpr.Operator.EQUALS); + var ifStmt = new IfStmt(equality, + new ReturnStmt(new IntegerLiteralExpr(Integer.valueOf(i))), null); + method.getBody().get().addAndGetStatement(ifStmt); + } + method.getBody().get() + .addAndGetStatement(new ReturnStmt(new IntegerLiteralExpr(Integer.valueOf(0)))); + } + + + private Expression callEquals(Expression scope, Expression arg) { + return new MethodCallExpr(scope, "equals", new NodeList<>(arg)); + } + + private StringLiteralExpr strLiteral(String n) { + return new StringLiteralExpr(n); + } } diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/transformations/pipeline/EnumClassDeclaration.java b/key.core/src/main/java/de/uka/ilkd/key/java/transformations/pipeline/EnumClassDeclaration.java deleted file mode 100644 index 90e2878ce1a..00000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/java/transformations/pipeline/EnumClassDeclaration.java +++ /dev/null @@ -1,183 +0,0 @@ -/* This file is part of KeY - https://key-project.org - * KeY is licensed under the GNU General Public License Version 2 - * SPDX-License-Identifier: GPL-2.0-only */ -package de.uka.ilkd.key.java.transformations.pipeline; - -import java.util.List; - -import com.github.javaparser.ast.Modifier; -import com.github.javaparser.ast.NodeList; -import com.github.javaparser.ast.body.*; -import com.github.javaparser.ast.expr.*; -import com.github.javaparser.ast.stmt.*; -import com.github.javaparser.ast.type.ArrayType; -import com.github.javaparser.ast.type.ClassOrInterfaceType; - -import static com.github.javaparser.ast.Modifier.DefaultKeyword.*; - -/// This class is used to describe an enum type by its equivalent class declaration. -/// The transformation [EnumClassBuilder] transform an [EnumDeclaration] to an -/// EnumClassDeclaration by -/// - adding static fields for the enum constants -/// - adding static field for names -/// - adding the methods as specified in the JLS 8.9 -/// - adding "extends Enum" to the ClassDeclaration -/// -/// Currently anonymous implementations for constants are not supported as they are anonymous inner -/// classes which are not supported by KeY. -/// -/// The additional methods are constructed as follows (E is the name of the enum, (e1, ..., en) its -/// constants): -///

-/// public static E[] values() { return new E[] { e1,..., en } };
-///
-/// public static E valueOf(java.lang.String string) {
-/// for(E e : values()) {
-/// if(e.name().equals(string))
-/// return e;
-/// }
-/// throw new IllegalArgumentException();
-/// }
-///
-/// public java.lang.String name() { return ENUM_NAMES[ordinal()]; }
-/// 
-/// -/// Additionally the fields that are enum constants are remembered. -/// -/// @author mulbrich, drodt -/// @since 2006-11-18 -/// @version 2026-03-03 -public class EnumClassDeclaration extends ClassOrInterfaceDeclaration { - /// name of the static variable of the array holding the names of the constants. - private static final String ENUM_NAMES = "$enumConstantNames"; - - /// store the EnumConstantDeclarations here. **NB: The AST-parent cannot be set to _this_ - /// because it is not a EnumDeclaration. - private final List enumConstants; - - public EnumClassDeclaration() { - super(); - enumConstants = new NodeList<>(); - } - - public EnumClassDeclaration(EnumDeclaration ed) { - this(); - - setName(ed.getName().clone()); - - var modifiers = new NodeList(); - for (var m : ed.modifiers()) { - modifiers.add(m.clone()); - } - if (!ed.hasModifier(FINAL)) { - // enum is always final - modifiers.add(new Modifier(FINAL)); - } - setModifiers(modifiers); - - if (ed.getComment().isPresent()) { - setComment(ed.getComment().get().clone()); - } - - setExtendedTypes(new NodeList<>(new ClassOrInterfaceType( - new ClassOrInterfaceType(new ClassOrInterfaceType(null, "java"), "lang"), "Enum"))); - - var implementsTypes = new NodeList(); - for (var it : ed.implementedTypes()) { - implementsTypes.add(it.clone()); - } - setImplementedTypes(implementsTypes); - - for (var e : ed.entries()) { - enumConstants.add(e.clone()); - makeConstantField(e); - } - - for (var m : ed.members()) { - addMember(m.clone()); - } - - addInternalFields(); - - addImplicitMethods(); - } - - /** - * get all declared enum constants for this enum. return them as a list. - * - * @return a list of the enum constants, not null - */ - public List getEnumConstantDeclarations() { - return enumConstants; - } - - private void makeConstantField(EnumConstantDeclaration e) { - var args = new NodeList(); - for (var a : e.arguments()) { - args.add(a.clone()); - } - var init = - new ObjectCreationExpr(null, new ClassOrInterfaceType(null, getNameAsString()), args); - addMember(new FieldDeclaration( - new NodeList<>(new Modifier(PUBLIC), - new Modifier(STATIC), new Modifier(FINAL)), - new VariableDeclarator(new ClassOrInterfaceType(null, getNameAsString()), e.name(), - init))); - } - - private void addInternalFields() { - var init = new ArrayInitializerExpr(); - for (var ec : getEnumConstantDeclarations()) { - init.values().add(new StringLiteralExpr(ec.getNameAsString())); - } - addMember(new FieldDeclaration( - new NodeList<>(new Modifier(PRIVATE), - new Modifier(STATIC)), - new VariableDeclarator(new ArrayType(new ClassOrInterfaceType(null, "String")), - ENUM_NAMES, init))); - } - - private void addImplicitMethods() { - // public static #E[] values() { return new #E { #consts }; } - var consts = new NodeList(); - for (var ec : getEnumConstantDeclarations()) { - consts.add(new NameExpr(ec.getNameAsString())); - } - addMember(new MethodDeclaration( - new NodeList<>(new Modifier(PUBLIC), - new Modifier(STATIC)), - new NodeList<>(), new NodeList<>(), - new ArrayType(new ClassOrInterfaceType(null, getNameAsString())), - new SimpleName("values"), new NodeList<>(), new NodeList<>(), new BlockStmt( - new NodeList<>(new ReturnStmt(new ArrayInitializerExpr(consts)))))); - - // public static #E valueOf(String string) { for (#E e : values()) { if - // (e.name().equals(string)) return e; } throw new IllegalArgumentException(); } - addMember(new MethodDeclaration( - new NodeList<>(new Modifier(PUBLIC), - new Modifier(STATIC)), - new NodeList<>(), new NodeList<>(), new ClassOrInterfaceType(null, getNameAsString()), - new SimpleName("valueOf"), - new NodeList<>(new Parameter(new ClassOrInterfaceType(null, "String"), "string")), - new NodeList<>(), new BlockStmt( - new NodeList<>( - new ForEachStmt( - new VariableDeclarationExpr( - new ClassOrInterfaceType(null, getNameAsString()), "e"), - new MethodCallExpr("values"), new BlockStmt( - new NodeList<>(new IfStmt( - new MethodCallExpr(new MethodCallExpr(new NameExpr("e"), "name"), - "equals", new NodeList<>(new NameExpr("string"))), - new ReturnStmt(new NameExpr("e")), null)))), - new ThrowStmt(new ObjectCreationExpr(null, - new ClassOrInterfaceType(null, "IllegalArgumentException"), - new NodeList<>())))))); - - // public String name() { return $enumConstantNames[ordinal()]; } - addMember(new MethodDeclaration(new NodeList<>(new Modifier(PUBLIC)), - new NodeList<>(), new NodeList<>(), new ClassOrInterfaceType(null, getNameAsString()), - new SimpleName("name"), new NodeList<>(), new NodeList<>(), new BlockStmt( - new NodeList<>(new ReturnStmt(new ArrayAccessExpr(new NameExpr(ENUM_NAMES), - new MethodCallExpr("ordinal"))))))); - } -} diff --git a/key.core/src/main/resources/de/uka/ilkd/key/proof/rules/java5.key b/key.core/src/main/resources/de/uka/ilkd/key/proof/rules/java5.key index 1ffd4327054..2761d8d2fbe 100644 --- a/key.core/src/main/resources/de/uka/ilkd/key/proof/rules/java5.key +++ b/key.core/src/main/resources/de/uka/ilkd/key/proof/rules/java5.key @@ -77,21 +77,21 @@ ***/ \rules(programRules:Java) { enumConstantEq { - \find( E::final(null, e1) = E::final(null, e2) ) + \find( final(null, e1) = final(null, e2) ) \varcond(\isEnumConst(E, e1), \isEnumConst(E, e2)) \replacewith( e1 = e2 ) \heuristics(simplify) }; enumConstantNull { - \find( E::final(null, e) = null ) + \find( final(null, e) = null ) \varcond(\isEnumConst(E, e)) \replacewith( false ) \heuristics(simplify) }; enumOrdinalToIndex { - \find( enumOrdinal(E::final(null, e)) ) + \find( enumOrdinal(final(null, e)) ) \varcond(\isEnumConst(E, e)) \replacewith( #enumconstantvalue(e) ) \heuristics(simplify) diff --git a/key.core/src/test/java/KeyJavaPipelineTest.java b/key.core/src/test/java/de/uka/ilkd/key/java/transformations/pipeline/KeyJavaPipelineTest.java similarity index 96% rename from key.core/src/test/java/KeyJavaPipelineTest.java rename to key.core/src/test/java/de/uka/ilkd/key/java/transformations/pipeline/KeyJavaPipelineTest.java index 26a7056d378..ece217b92fb 100644 --- a/key.core/src/test/java/KeyJavaPipelineTest.java +++ b/key.core/src/test/java/de/uka/ilkd/key/java/transformations/pipeline/KeyJavaPipelineTest.java @@ -1,6 +1,8 @@ /* This file is part of KeY - https://key-project.org * KeY is licensed under the GNU General Public License Version 2 * SPDX-License-Identifier: GPL-2.0-only */ +package de.uka.ilkd.key.java.transformations.pipeline; + import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -14,9 +16,6 @@ import de.uka.ilkd.key.java.Services; import de.uka.ilkd.key.java.SpecialJavaPrinter; import de.uka.ilkd.key.java.transformations.KeYJavaPipeline; -import de.uka.ilkd.key.java.transformations.pipeline.JavaTransformer; -import de.uka.ilkd.key.java.transformations.pipeline.JavaTransformerAbstract; -import de.uka.ilkd.key.java.transformations.pipeline.TransformationPipelineServices; import de.uka.ilkd.key.nparser.NamespaceBuilder; import de.uka.ilkd.key.proof.init.JavaProfile; @@ -102,6 +101,11 @@ Stream innerclass() throws IOException { return generatePipelineTests(Paths.get("pipelineTests/innerclass").toAbsolutePath()); } + @TestFactory + Stream enums() throws IOException { + return generatePipelineTests(Paths.get("pipelineTests/enums").toAbsolutePath()); + } + private Stream generatePipelineTests(Path testFolder) throws IOException { var pt = createPipelineTest(testFolder); diff --git a/key.ui/examples/Java/Enums/README.txt b/key.ui/examples/Java/Enums/README.txt new file mode 100644 index 00000000000..bd0694a870b --- /dev/null +++ b/key.ui/examples/Java/Enums/README.txt @@ -0,0 +1,8 @@ +example.path = Java 25 +example.name = Enums +example.file = project.key +example.additionalFile.1 = src/Checker.java + +Example for the use of Java Enums in KeY + +KeY supports Enums diff --git a/key.ui/examples/Java/Enums/project.key b/key.ui/examples/Java/Enums/project.key new file mode 100644 index 00000000000..def675c6c38 --- /dev/null +++ b/key.ui/examples/Java/Enums/project.key @@ -0,0 +1,3 @@ +\javaSource "src"; + +\chooseContract \ No newline at end of file diff --git a/key.ui/examples/Java/Enums/src/Checker.java b/key.ui/examples/Java/Enums/src/Checker.java new file mode 100644 index 00000000000..822eafb7cae --- /dev/null +++ b/key.ui/examples/Java/Enums/src/Checker.java @@ -0,0 +1,25 @@ +enum Severity {INFO, WARNING, CRITIQUE } + +public class Checker { + /*@ public normal_behaviour + @ ensures \result != null; + @*/ + Severity checkIt() { + return Severity.INFO; + } + + /*@ public normal_behaviour + @ requires \static_invariant_for(Severity); + @ ensures \result == 1; + @*/ + int ord() { + return Severity.WARNING.ordinal(); + } + + /*@ public normal_behaviour + @ ensures \result != Severity.CRITIQUE; + @*/ + Severity different() { + return Severity.INFO; + } +} \ No newline at end of file diff --git a/key.ui/examples/index/samplesIndex.txt b/key.ui/examples/index/samplesIndex.txt index 666003ded24..3ccfb42eb56 100644 --- a/key.ui/examples/index/samplesIndex.txt +++ b/key.ui/examples/index/samplesIndex.txt @@ -25,6 +25,7 @@ heap/FM2024Tutorial/BinarySearch/README.txt heap/FM2024Tutorial/ArrayList/README.txt # Java Features +Java/Enums/README.txt Java/MultiCatch/README.txt Java/Records/README.txt Java/Records+CompactConstructor/README.txt From 38e1edde74b548447effef366ee232d166a24a71 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Sat, 22 Aug 2026 23:06:10 +0200 Subject: [PATCH 09/10] fix problem in printer --- .../uka/ilkd/key/java/SpecialJavaPrinter.java | 57 +++++++++++++------ .../pipeline/EnumClassBuilder.java | 10 ++-- 2 files changed, 46 insertions(+), 21 deletions(-) diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/SpecialJavaPrinter.java b/key.core/src/main/java/de/uka/ilkd/key/java/SpecialJavaPrinter.java index c148c5b6a51..ef497e32b3a 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/java/SpecialJavaPrinter.java +++ b/key.core/src/main/java/de/uka/ilkd/key/java/SpecialJavaPrinter.java @@ -184,7 +184,7 @@ private void print(TextualJMLLoopSpec specCase) { class ToStringVisitor extends JmlParserBaseVisitor { @Override public String visitTerminal(TerminalNode node) { - return node.getText(); + return node.getSymbol().getText(); } public String accept(@Nullable ParseTree ctx) { @@ -216,7 +216,7 @@ public String visitAccessible_clause(JmlParser.Accessible_clauseContext ctx) { @Override public String visitAdditiveexpr(JmlParser.AdditiveexprContext ctx) { - return accept(ctx.multexpr(), ctx.op); + return acceptt(ctx.multexpr(), ctx.op); } @Override @@ -259,7 +259,7 @@ public String visitAssignable_clause(JmlParser.Assignable_clauseContext ctx) { private String accept(TerminalNode terminalNode) { if (terminalNode != null) - return terminalNode.getText(); + return terminalNode.getSymbol().getText(); return ""; } @@ -415,12 +415,45 @@ public String visitEnsures_clause(JmlParser.Ensures_clauseContext ctx) { @Override public String visitEqualityexpr(JmlParser.EqualityexprContext ctx) { - return accept(ctx.relationalexpr(), " == "); // TODO + return accept(ctx.relationalexpr(), ctx.EQ_NEQ()); } @Override public String visitEquivalenceexpr(JmlParser.EquivalenceexprContext ctx) { - return accept(ctx.impliesexpr(), "<==>"); // TODO + return accept(ctx.impliesexpr(), ctx.EQV_ANTIV()); + } + + private String acceptt(List children, List separators) { + StringBuilder sb = new StringBuilder(); + var siter = separators.iterator(); + var citer = children.iterator(); + + while (citer.hasNext()) { + sb.append(accept(citer.next())); + if (citer.hasNext() && siter.hasNext()) { + sb.append(" "); + sb.append(siter.next().getText()); + sb.append(" "); + } + } + return sb.toString(); + } + + private String accept(List children, + List separators) { + StringBuilder sb = new StringBuilder(); + var siter = separators.iterator(); + var citer = children.iterator(); + + while (citer.hasNext()) { + sb.append(accept(citer.next())); + if (citer.hasNext() && siter.hasNext()) { + sb.append(" "); + sb.append(accept(siter.next())); + sb.append(" "); + } + } + return sb.toString(); } @Override @@ -690,7 +723,7 @@ public String visitMonitors_for_clause(JmlParser.Monitors_for_clauseContext ctx) @Override public String visitMultexpr(JmlParser.MultexprContext ctx) { - return accept(ctx.unaryexpr(), ctx.op); + return acceptt(ctx.unaryexpr(), ctx.op); } @Override @@ -1094,7 +1127,7 @@ public String visitReferencetype(JmlParser.ReferencetypeContext ctx) { @Override public String visitRelational_chain(JmlParser.Relational_chainContext ctx) { - return accept(ctx.shiftexpr(), ctx.op); + return acceptt(ctx.shiftexpr(), ctx.op); } @Override @@ -1202,15 +1235,7 @@ public String visitSet_statement(JmlParser.Set_statementContext ctx) { @Override public String visitShiftexpr(JmlParser.ShiftexprContext ctx) { - return accept(ctx.additiveexpr(), ctx.op); - } - - private String accept(List expr, List op) { - StringBuilder s = new StringBuilder(accept(expr.getFirst())); - for (var i = 1; i < expr.size(); i++) { - s.append(" ").append(op.get(i - 1)).append(" ").append(accept(expr.get(i))); - } - return s.toString(); + return acceptt(ctx.additiveexpr(), ctx.op); } @Override diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/transformations/pipeline/EnumClassBuilder.java b/key.core/src/main/java/de/uka/ilkd/key/java/transformations/pipeline/EnumClassBuilder.java index b080f76fb40..0c4b2a16660 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/java/transformations/pipeline/EnumClassBuilder.java +++ b/key.core/src/main/java/de/uka/ilkd/key/java/transformations/pipeline/EnumClassBuilder.java @@ -103,11 +103,11 @@ ClassOrInterfaceDeclaration createEnumClassEquivalent(EnumDeclaration declaratio private void addDisjointInvariant(ClassOrInterfaceDeclaration cu, EnumDeclaration declaration) { var consts = declaration.getEntries().stream() - .map(NodeWithSimpleName::getNameAsString).toList(); - for (var a : consts) { - for (var b : consts) { - if (a == b) - continue; + .map(NodeWithSimpleName::getNameAsString).sorted().toList(); + for (int i = 0; i < consts.size(); i++) { + var a = consts.get(i); + for (int j = i + 1; j < consts.size(); j++) { + var b = consts.get(j); services.attachTypeSpec(cu, "static invariant %s != %s;".formatted(a, b)); } } From ff81fddbca0b77de2d190ea05aa160b43f728b9f Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Sat, 22 Aug 2026 23:07:05 +0200 Subject: [PATCH 10/10] update groundtruth after bugfixing in printer --- .../05_EnumClassBuilder/SimpleEnum.java | 5 +- .../06_RecordClassBuilder/SimpleEnum.java | 5 +- .../07_JMLTransformer/SimpleEnum.java | 5 +- .../expected/08_JmlDocRemoval/SimpleEnum.java | 5 +- .../09_ImplicitFieldAdder/SimpleEnum.java | 5 +- .../SimpleEnum.java | 5 +- .../SimpleEnum.java | 5 +- .../SimpleEnum.java | 5 +- .../SimpleEnum.java | 5 +- .../14_PrepareObjectBuilder/SimpleEnum.java | 5 +- .../expected/15_CreateBuilder/SimpleEnum.java | 5 +- .../16_CreateObjectBuilder/SimpleEnum.java | 5 +- .../SimpleEnum.java | 5 +- .../SimpleEnum.java | 5 +- .../MostSimpleInner.java | 5 + .../05_EnumClassBuilder/MostSimpleInner.java | 5 + .../MostSimpleInner.java | 5 + .../07_JMLTransformer/MostSimpleInner.java | 5 + .../08_JmlDocRemoval/MostSimpleInner.java | 5 + .../MostSimpleInner.java | 41 ++ .../MostSimpleInner.java | 45 +++ .../MostSimpleInner.java | 61 +++ .../MostSimpleInner.java | 67 ++++ .../MostSimpleInner.java | 143 +++++++ .../MostSimpleInner.java | 159 ++++++++ .../15_CreateBuilder/MostSimpleInner.java | 173 +++++++++ .../MostSimpleInner.java | 189 +++++++++ .../MostSimpleInner.java | 189 +++++++++ .../MostSimpleInner.java | 189 +++++++++ .../CompactConstructor.java | 8 + .../InnerRecord.java | 7 + .../NotAllowed.java | 36 ++ .../04_EnumClassAccessExplicit/Point3d.java | 2 + .../RecordOverwriting.java | 14 + .../SimpleRecord.java | 6 + .../CompactConstructor.java | 8 + .../05_EnumClassBuilder/InnerRecord.java | 7 + .../05_EnumClassBuilder/NotAllowed.java | 36 ++ .../expected/05_EnumClassBuilder/Point3d.java | 2 + .../RecordOverwriting.java | 14 + .../05_EnumClassBuilder/SimpleRecord.java | 6 + .../CompactConstructor.java | 66 ++++ .../06_RecordClassBuilder/InnerRecord.java | 56 +++ .../06_RecordClassBuilder/NotAllowed.java | 150 +++++++ .../06_RecordClassBuilder/Point3d.java | 71 ++++ .../RecordOverwriting.java | 36 ++ .../06_RecordClassBuilder/SimpleRecord.java | 59 +++ .../07_JMLTransformer/CompactConstructor.java | 66 ++++ .../07_JMLTransformer/InnerRecord.java | 56 +++ .../07_JMLTransformer/NotAllowed.java | 150 +++++++ .../expected/07_JMLTransformer/Point3d.java | 71 ++++ .../07_JMLTransformer/RecordOverwriting.java | 36 ++ .../07_JMLTransformer/SimpleRecord.java | 59 +++ .../08_JmlDocRemoval/CompactConstructor.java | 66 ++++ .../08_JmlDocRemoval/InnerRecord.java | 56 +++ .../expected/08_JmlDocRemoval/NotAllowed.java | 150 +++++++ .../expected/08_JmlDocRemoval/Point3d.java | 71 ++++ .../08_JmlDocRemoval/RecordOverwriting.java | 36 ++ .../08_JmlDocRemoval/SimpleRecord.java | 59 +++ .../CompactConstructor.java | 84 ++++ .../09_ImplicitFieldAdder/InnerRecord.java | 94 +++++ .../09_ImplicitFieldAdder/NotAllowed.java | 186 +++++++++ .../09_ImplicitFieldAdder/Point3d.java | 89 +++++ .../RecordOverwriting.java | 54 +++ .../09_ImplicitFieldAdder/SimpleRecord.java | 77 ++++ .../CompactConstructor.java | 86 ++++ .../InnerRecord.java | 98 +++++ .../NotAllowed.java | 191 +++++++++ .../Point3d.java | 91 +++++ .../RecordOverwriting.java | 56 +++ .../SimpleRecord.java | 79 ++++ .../CompactConstructor.java | 99 +++++ .../InnerRecord.java | 113 ++++++ .../NotAllowed.java | 223 +++++++++++ .../Point3d.java | 101 +++++ .../RecordOverwriting.java | 62 +++ .../SimpleRecord.java | 89 +++++ .../CompactConstructor.java | 102 +++++ .../InnerRecord.java | 119 ++++++ .../NotAllowed.java | 229 +++++++++++ .../Point3d.java | 104 +++++ .../RecordOverwriting.java | 65 ++++ .../SimpleRecord.java | 92 +++++ .../CompactConstructor.java | 140 +++++++ .../InnerRecord.java | 195 ++++++++++ .../NotAllowed.java | 305 +++++++++++++++ .../Point3d.java | 142 +++++++ .../RecordOverwriting.java | 103 +++++ .../SimpleRecord.java | 130 +++++++ .../CompactConstructor.java | 156 ++++++++ .../14_PrepareObjectBuilder/InnerRecord.java | 219 +++++++++++ .../14_PrepareObjectBuilder/NotAllowed.java | 333 ++++++++++++++++ .../14_PrepareObjectBuilder/Point3d.java | 162 ++++++++ .../RecordOverwriting.java | 115 ++++++ .../14_PrepareObjectBuilder/SimpleRecord.java | 142 +++++++ .../15_CreateBuilder/CompactConstructor.java | 163 ++++++++ .../15_CreateBuilder/InnerRecord.java | 233 +++++++++++ .../expected/15_CreateBuilder/NotAllowed.java | 347 +++++++++++++++++ .../expected/15_CreateBuilder/Point3d.java | 169 ++++++++ .../15_CreateBuilder/RecordOverwriting.java | 122 ++++++ .../15_CreateBuilder/SimpleRecord.java | 149 +++++++ .../CompactConstructor.java | 171 ++++++++ .../16_CreateObjectBuilder/InnerRecord.java | 249 ++++++++++++ .../16_CreateObjectBuilder/NotAllowed.java | 367 ++++++++++++++++++ .../16_CreateObjectBuilder/Point3d.java | 177 +++++++++ .../RecordOverwriting.java | 130 +++++++ .../16_CreateObjectBuilder/SimpleRecord.java | 157 ++++++++ .../CompactConstructor.java | 171 ++++++++ .../InnerRecord.java | 249 ++++++++++++ .../NotAllowed.java | 367 ++++++++++++++++++ .../17_LocalClassTransformation/Point3d.java | 177 +++++++++ .../RecordOverwriting.java | 130 +++++++ .../SimpleRecord.java | 157 ++++++++ .../CompactConstructor.java | 171 ++++++++ .../InnerRecord.java | 249 ++++++++++++ .../NotAllowed.java | 367 ++++++++++++++++++ .../Point3d.java | 177 +++++++++ .../RecordOverwriting.java | 130 +++++++ .../SimpleRecord.java | 157 ++++++++ .../04_EnumClassAccessExplicit/Test.java | 24 ++ .../expected/05_EnumClassBuilder/Test.java | 24 ++ .../expected/06_RecordClassBuilder/Test.java | 24 ++ .../expected/07_JMLTransformer/Test.java | 24 ++ .../expected/08_JmlDocRemoval/Test.java | 24 ++ .../expected/09_ImplicitFieldAdder/Test.java | 60 +++ .../Test.java | 64 +++ .../11_ConstructorNormalformBuilder/Test.java | 100 +++++ .../Test.java | 106 +++++ .../13_ClassInitializeMethodBuilder/Test.java | 186 +++++++++ .../14_PrepareObjectBuilder/Test.java | 210 ++++++++++ .../expected/15_CreateBuilder/Test.java | 224 +++++++++++ .../expected/16_CreateObjectBuilder/Test.java | 240 ++++++++++++ .../17_LocalClassTransformation/Test.java | 240 ++++++++++++ .../Test.java | 240 ++++++++++++ 134 files changed, 14248 insertions(+), 14 deletions(-) create mode 100644 key.core/pipelineTests/innerclass/expected/04_EnumClassAccessExplicit/MostSimpleInner.java create mode 100644 key.core/pipelineTests/innerclass/expected/05_EnumClassBuilder/MostSimpleInner.java create mode 100644 key.core/pipelineTests/innerclass/expected/06_RecordClassBuilder/MostSimpleInner.java create mode 100644 key.core/pipelineTests/innerclass/expected/07_JMLTransformer/MostSimpleInner.java create mode 100644 key.core/pipelineTests/innerclass/expected/08_JmlDocRemoval/MostSimpleInner.java create mode 100644 key.core/pipelineTests/innerclass/expected/09_ImplicitFieldAdder/MostSimpleInner.java create mode 100644 key.core/pipelineTests/innerclass/expected/10_InstanceAllocationMethodBuilder/MostSimpleInner.java create mode 100644 key.core/pipelineTests/innerclass/expected/11_ConstructorNormalformBuilder/MostSimpleInner.java create mode 100644 key.core/pipelineTests/innerclass/expected/12_ClassPreparationMethodBuilder/MostSimpleInner.java create mode 100644 key.core/pipelineTests/innerclass/expected/13_ClassInitializeMethodBuilder/MostSimpleInner.java create mode 100644 key.core/pipelineTests/innerclass/expected/14_PrepareObjectBuilder/MostSimpleInner.java create mode 100644 key.core/pipelineTests/innerclass/expected/15_CreateBuilder/MostSimpleInner.java create mode 100644 key.core/pipelineTests/innerclass/expected/16_CreateObjectBuilder/MostSimpleInner.java create mode 100644 key.core/pipelineTests/innerclass/expected/17_LocalClassTransformation/MostSimpleInner.java create mode 100644 key.core/pipelineTests/innerclass/expected/18_ConstantStringExpressionEvaluator/MostSimpleInner.java create mode 100644 key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/CompactConstructor.java create mode 100644 key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/InnerRecord.java create mode 100644 key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/NotAllowed.java create mode 100644 key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/Point3d.java create mode 100644 key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/RecordOverwriting.java create mode 100644 key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/SimpleRecord.java create mode 100644 key.core/pipelineTests/records/expected/05_EnumClassBuilder/CompactConstructor.java create mode 100644 key.core/pipelineTests/records/expected/05_EnumClassBuilder/InnerRecord.java create mode 100644 key.core/pipelineTests/records/expected/05_EnumClassBuilder/NotAllowed.java create mode 100644 key.core/pipelineTests/records/expected/05_EnumClassBuilder/Point3d.java create mode 100644 key.core/pipelineTests/records/expected/05_EnumClassBuilder/RecordOverwriting.java create mode 100644 key.core/pipelineTests/records/expected/05_EnumClassBuilder/SimpleRecord.java create mode 100644 key.core/pipelineTests/records/expected/06_RecordClassBuilder/CompactConstructor.java create mode 100644 key.core/pipelineTests/records/expected/06_RecordClassBuilder/InnerRecord.java create mode 100644 key.core/pipelineTests/records/expected/06_RecordClassBuilder/NotAllowed.java create mode 100644 key.core/pipelineTests/records/expected/06_RecordClassBuilder/Point3d.java create mode 100644 key.core/pipelineTests/records/expected/06_RecordClassBuilder/RecordOverwriting.java create mode 100644 key.core/pipelineTests/records/expected/06_RecordClassBuilder/SimpleRecord.java create mode 100644 key.core/pipelineTests/records/expected/07_JMLTransformer/CompactConstructor.java create mode 100644 key.core/pipelineTests/records/expected/07_JMLTransformer/InnerRecord.java create mode 100644 key.core/pipelineTests/records/expected/07_JMLTransformer/NotAllowed.java create mode 100644 key.core/pipelineTests/records/expected/07_JMLTransformer/Point3d.java create mode 100644 key.core/pipelineTests/records/expected/07_JMLTransformer/RecordOverwriting.java create mode 100644 key.core/pipelineTests/records/expected/07_JMLTransformer/SimpleRecord.java create mode 100644 key.core/pipelineTests/records/expected/08_JmlDocRemoval/CompactConstructor.java create mode 100644 key.core/pipelineTests/records/expected/08_JmlDocRemoval/InnerRecord.java create mode 100644 key.core/pipelineTests/records/expected/08_JmlDocRemoval/NotAllowed.java create mode 100644 key.core/pipelineTests/records/expected/08_JmlDocRemoval/Point3d.java create mode 100644 key.core/pipelineTests/records/expected/08_JmlDocRemoval/RecordOverwriting.java create mode 100644 key.core/pipelineTests/records/expected/08_JmlDocRemoval/SimpleRecord.java create mode 100644 key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/CompactConstructor.java create mode 100644 key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/InnerRecord.java create mode 100644 key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/NotAllowed.java create mode 100644 key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/Point3d.java create mode 100644 key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/RecordOverwriting.java create mode 100644 key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/SimpleRecord.java create mode 100644 key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/CompactConstructor.java create mode 100644 key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/InnerRecord.java create mode 100644 key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/NotAllowed.java create mode 100644 key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/Point3d.java create mode 100644 key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/RecordOverwriting.java create mode 100644 key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/SimpleRecord.java create mode 100644 key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/CompactConstructor.java create mode 100644 key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/InnerRecord.java create mode 100644 key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/NotAllowed.java create mode 100644 key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/Point3d.java create mode 100644 key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/RecordOverwriting.java create mode 100644 key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/SimpleRecord.java create mode 100644 key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/CompactConstructor.java create mode 100644 key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/InnerRecord.java create mode 100644 key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/NotAllowed.java create mode 100644 key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/Point3d.java create mode 100644 key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/RecordOverwriting.java create mode 100644 key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/SimpleRecord.java create mode 100644 key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/CompactConstructor.java create mode 100644 key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/InnerRecord.java create mode 100644 key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/NotAllowed.java create mode 100644 key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/Point3d.java create mode 100644 key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/RecordOverwriting.java create mode 100644 key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/SimpleRecord.java create mode 100644 key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/CompactConstructor.java create mode 100644 key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/InnerRecord.java create mode 100644 key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/NotAllowed.java create mode 100644 key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/Point3d.java create mode 100644 key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/RecordOverwriting.java create mode 100644 key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/SimpleRecord.java create mode 100644 key.core/pipelineTests/records/expected/15_CreateBuilder/CompactConstructor.java create mode 100644 key.core/pipelineTests/records/expected/15_CreateBuilder/InnerRecord.java create mode 100644 key.core/pipelineTests/records/expected/15_CreateBuilder/NotAllowed.java create mode 100644 key.core/pipelineTests/records/expected/15_CreateBuilder/Point3d.java create mode 100644 key.core/pipelineTests/records/expected/15_CreateBuilder/RecordOverwriting.java create mode 100644 key.core/pipelineTests/records/expected/15_CreateBuilder/SimpleRecord.java create mode 100644 key.core/pipelineTests/records/expected/16_CreateObjectBuilder/CompactConstructor.java create mode 100644 key.core/pipelineTests/records/expected/16_CreateObjectBuilder/InnerRecord.java create mode 100644 key.core/pipelineTests/records/expected/16_CreateObjectBuilder/NotAllowed.java create mode 100644 key.core/pipelineTests/records/expected/16_CreateObjectBuilder/Point3d.java create mode 100644 key.core/pipelineTests/records/expected/16_CreateObjectBuilder/RecordOverwriting.java create mode 100644 key.core/pipelineTests/records/expected/16_CreateObjectBuilder/SimpleRecord.java create mode 100644 key.core/pipelineTests/records/expected/17_LocalClassTransformation/CompactConstructor.java create mode 100644 key.core/pipelineTests/records/expected/17_LocalClassTransformation/InnerRecord.java create mode 100644 key.core/pipelineTests/records/expected/17_LocalClassTransformation/NotAllowed.java create mode 100644 key.core/pipelineTests/records/expected/17_LocalClassTransformation/Point3d.java create mode 100644 key.core/pipelineTests/records/expected/17_LocalClassTransformation/RecordOverwriting.java create mode 100644 key.core/pipelineTests/records/expected/17_LocalClassTransformation/SimpleRecord.java create mode 100644 key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/CompactConstructor.java create mode 100644 key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/InnerRecord.java create mode 100644 key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/NotAllowed.java create mode 100644 key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/Point3d.java create mode 100644 key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/RecordOverwriting.java create mode 100644 key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/SimpleRecord.java create mode 100644 key.core/pipelineTests/simple/expected/04_EnumClassAccessExplicit/Test.java create mode 100644 key.core/pipelineTests/simple/expected/05_EnumClassBuilder/Test.java create mode 100644 key.core/pipelineTests/simple/expected/06_RecordClassBuilder/Test.java create mode 100644 key.core/pipelineTests/simple/expected/07_JMLTransformer/Test.java create mode 100644 key.core/pipelineTests/simple/expected/08_JmlDocRemoval/Test.java create mode 100644 key.core/pipelineTests/simple/expected/09_ImplicitFieldAdder/Test.java create mode 100644 key.core/pipelineTests/simple/expected/10_InstanceAllocationMethodBuilder/Test.java create mode 100644 key.core/pipelineTests/simple/expected/11_ConstructorNormalformBuilder/Test.java create mode 100644 key.core/pipelineTests/simple/expected/12_ClassPreparationMethodBuilder/Test.java create mode 100644 key.core/pipelineTests/simple/expected/13_ClassInitializeMethodBuilder/Test.java create mode 100644 key.core/pipelineTests/simple/expected/14_PrepareObjectBuilder/Test.java create mode 100644 key.core/pipelineTests/simple/expected/15_CreateBuilder/Test.java create mode 100644 key.core/pipelineTests/simple/expected/16_CreateObjectBuilder/Test.java create mode 100644 key.core/pipelineTests/simple/expected/17_LocalClassTransformation/Test.java create mode 100644 key.core/pipelineTests/simple/expected/18_ConstantStringExpressionEvaluator/Test.java diff --git a/key.core/pipelineTests/enums/expected/05_EnumClassBuilder/SimpleEnum.java b/key.core/pipelineTests/enums/expected/05_EnumClassBuilder/SimpleEnum.java index b37506129a9..8c5f7ff4056 100644 --- a/key.core/pipelineTests/enums/expected/05_EnumClassBuilder/SimpleEnum.java +++ b/key.core/pipelineTests/enums/expected/05_EnumClassBuilder/SimpleEnum.java @@ -1,5 +1,8 @@ public final class SimpleEnum extends Enum { - //@ static invariant A == null && B == null && C == null; + //@ static invariant A != null && B != null && C != null; + //@ static invariant A != B; + //@ static invariant A != C; + //@ static invariant B != C; //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); public static final SimpleEnum A = new SimpleEnum(); diff --git a/key.core/pipelineTests/enums/expected/06_RecordClassBuilder/SimpleEnum.java b/key.core/pipelineTests/enums/expected/06_RecordClassBuilder/SimpleEnum.java index b37506129a9..8c5f7ff4056 100644 --- a/key.core/pipelineTests/enums/expected/06_RecordClassBuilder/SimpleEnum.java +++ b/key.core/pipelineTests/enums/expected/06_RecordClassBuilder/SimpleEnum.java @@ -1,5 +1,8 @@ public final class SimpleEnum extends Enum { - //@ static invariant A == null && B == null && C == null; + //@ static invariant A != null && B != null && C != null; + //@ static invariant A != B; + //@ static invariant A != C; + //@ static invariant B != C; //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); public static final SimpleEnum A = new SimpleEnum(); diff --git a/key.core/pipelineTests/enums/expected/07_JMLTransformer/SimpleEnum.java b/key.core/pipelineTests/enums/expected/07_JMLTransformer/SimpleEnum.java index b37506129a9..8c5f7ff4056 100644 --- a/key.core/pipelineTests/enums/expected/07_JMLTransformer/SimpleEnum.java +++ b/key.core/pipelineTests/enums/expected/07_JMLTransformer/SimpleEnum.java @@ -1,5 +1,8 @@ public final class SimpleEnum extends Enum { - //@ static invariant A == null && B == null && C == null; + //@ static invariant A != null && B != null && C != null; + //@ static invariant A != B; + //@ static invariant A != C; + //@ static invariant B != C; //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); public static final SimpleEnum A = new SimpleEnum(); diff --git a/key.core/pipelineTests/enums/expected/08_JmlDocRemoval/SimpleEnum.java b/key.core/pipelineTests/enums/expected/08_JmlDocRemoval/SimpleEnum.java index b37506129a9..8c5f7ff4056 100644 --- a/key.core/pipelineTests/enums/expected/08_JmlDocRemoval/SimpleEnum.java +++ b/key.core/pipelineTests/enums/expected/08_JmlDocRemoval/SimpleEnum.java @@ -1,5 +1,8 @@ public final class SimpleEnum extends Enum { - //@ static invariant A == null && B == null && C == null; + //@ static invariant A != null && B != null && C != null; + //@ static invariant A != B; + //@ static invariant A != C; + //@ static invariant B != C; //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); public static final SimpleEnum A = new SimpleEnum(); diff --git a/key.core/pipelineTests/enums/expected/09_ImplicitFieldAdder/SimpleEnum.java b/key.core/pipelineTests/enums/expected/09_ImplicitFieldAdder/SimpleEnum.java index a685592b494..c7aeeacfe14 100644 --- a/key.core/pipelineTests/enums/expected/09_ImplicitFieldAdder/SimpleEnum.java +++ b/key.core/pipelineTests/enums/expected/09_ImplicitFieldAdder/SimpleEnum.java @@ -1,5 +1,8 @@ public final class SimpleEnum extends Enum { - //@ static invariant A == null && B == null && C == null; + //@ static invariant A != null && B != null && C != null; + //@ static invariant A != B; + //@ static invariant A != C; + //@ static invariant B != C; //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); public static final SimpleEnum A = new SimpleEnum(); diff --git a/key.core/pipelineTests/enums/expected/10_InstanceAllocationMethodBuilder/SimpleEnum.java b/key.core/pipelineTests/enums/expected/10_InstanceAllocationMethodBuilder/SimpleEnum.java index 564f3d19745..c9d3407d54b 100644 --- a/key.core/pipelineTests/enums/expected/10_InstanceAllocationMethodBuilder/SimpleEnum.java +++ b/key.core/pipelineTests/enums/expected/10_InstanceAllocationMethodBuilder/SimpleEnum.java @@ -1,5 +1,8 @@ public final class SimpleEnum extends Enum { - //@ static invariant A == null && B == null && C == null; + //@ static invariant A != null && B != null && C != null; + //@ static invariant A != B; + //@ static invariant A != C; + //@ static invariant B != C; //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); public static final SimpleEnum A = new SimpleEnum(); diff --git a/key.core/pipelineTests/enums/expected/11_ConstructorNormalformBuilder/SimpleEnum.java b/key.core/pipelineTests/enums/expected/11_ConstructorNormalformBuilder/SimpleEnum.java index 16de398524d..80d50fe7c9f 100644 --- a/key.core/pipelineTests/enums/expected/11_ConstructorNormalformBuilder/SimpleEnum.java +++ b/key.core/pipelineTests/enums/expected/11_ConstructorNormalformBuilder/SimpleEnum.java @@ -1,5 +1,8 @@ public final class SimpleEnum extends Enum { - //@ static invariant A == null && B == null && C == null; + //@ static invariant A != null && B != null && C != null; + //@ static invariant A != B; + //@ static invariant A != C; + //@ static invariant B != C; //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); public static final SimpleEnum A = new SimpleEnum(); diff --git a/key.core/pipelineTests/enums/expected/12_ClassPreparationMethodBuilder/SimpleEnum.java b/key.core/pipelineTests/enums/expected/12_ClassPreparationMethodBuilder/SimpleEnum.java index 98b2aa4a8a8..dc4d871c9fe 100644 --- a/key.core/pipelineTests/enums/expected/12_ClassPreparationMethodBuilder/SimpleEnum.java +++ b/key.core/pipelineTests/enums/expected/12_ClassPreparationMethodBuilder/SimpleEnum.java @@ -1,5 +1,8 @@ public final class SimpleEnum extends Enum { - //@ static invariant A == null && B == null && C == null; + //@ static invariant A != null && B != null && C != null; + //@ static invariant A != B; + //@ static invariant A != C; + //@ static invariant B != C; //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); public static final SimpleEnum A = new SimpleEnum(); diff --git a/key.core/pipelineTests/enums/expected/13_ClassInitializeMethodBuilder/SimpleEnum.java b/key.core/pipelineTests/enums/expected/13_ClassInitializeMethodBuilder/SimpleEnum.java index 2a26ce78e55..5eb2e84e460 100644 --- a/key.core/pipelineTests/enums/expected/13_ClassInitializeMethodBuilder/SimpleEnum.java +++ b/key.core/pipelineTests/enums/expected/13_ClassInitializeMethodBuilder/SimpleEnum.java @@ -1,5 +1,8 @@ public final class SimpleEnum extends Enum { - //@ static invariant A == null && B == null && C == null; + //@ static invariant A != null && B != null && C != null; + //@ static invariant A != B; + //@ static invariant A != C; + //@ static invariant B != C; //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); public static final SimpleEnum A = new SimpleEnum(); diff --git a/key.core/pipelineTests/enums/expected/14_PrepareObjectBuilder/SimpleEnum.java b/key.core/pipelineTests/enums/expected/14_PrepareObjectBuilder/SimpleEnum.java index 0f92b49eaf7..d701ee4a291 100644 --- a/key.core/pipelineTests/enums/expected/14_PrepareObjectBuilder/SimpleEnum.java +++ b/key.core/pipelineTests/enums/expected/14_PrepareObjectBuilder/SimpleEnum.java @@ -1,5 +1,8 @@ public final class SimpleEnum extends Enum { - //@ static invariant A == null && B == null && C == null; + //@ static invariant A != null && B != null && C != null; + //@ static invariant A != B; + //@ static invariant A != C; + //@ static invariant B != C; //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); public static final SimpleEnum A = new SimpleEnum(); diff --git a/key.core/pipelineTests/enums/expected/15_CreateBuilder/SimpleEnum.java b/key.core/pipelineTests/enums/expected/15_CreateBuilder/SimpleEnum.java index e780b71f9e2..bb21181a360 100644 --- a/key.core/pipelineTests/enums/expected/15_CreateBuilder/SimpleEnum.java +++ b/key.core/pipelineTests/enums/expected/15_CreateBuilder/SimpleEnum.java @@ -1,5 +1,8 @@ public final class SimpleEnum extends Enum { - //@ static invariant A == null && B == null && C == null; + //@ static invariant A != null && B != null && C != null; + //@ static invariant A != B; + //@ static invariant A != C; + //@ static invariant B != C; //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); public static final SimpleEnum A = new SimpleEnum(); diff --git a/key.core/pipelineTests/enums/expected/16_CreateObjectBuilder/SimpleEnum.java b/key.core/pipelineTests/enums/expected/16_CreateObjectBuilder/SimpleEnum.java index c72e2eb5a64..a94b03ee05b 100644 --- a/key.core/pipelineTests/enums/expected/16_CreateObjectBuilder/SimpleEnum.java +++ b/key.core/pipelineTests/enums/expected/16_CreateObjectBuilder/SimpleEnum.java @@ -1,5 +1,8 @@ public final class SimpleEnum extends Enum { - //@ static invariant A == null && B == null && C == null; + //@ static invariant A != null && B != null && C != null; + //@ static invariant A != B; + //@ static invariant A != C; + //@ static invariant B != C; //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); public static final SimpleEnum A = new SimpleEnum(); diff --git a/key.core/pipelineTests/enums/expected/17_LocalClassTransformation/SimpleEnum.java b/key.core/pipelineTests/enums/expected/17_LocalClassTransformation/SimpleEnum.java index c72e2eb5a64..a94b03ee05b 100644 --- a/key.core/pipelineTests/enums/expected/17_LocalClassTransformation/SimpleEnum.java +++ b/key.core/pipelineTests/enums/expected/17_LocalClassTransformation/SimpleEnum.java @@ -1,5 +1,8 @@ public final class SimpleEnum extends Enum { - //@ static invariant A == null && B == null && C == null; + //@ static invariant A != null && B != null && C != null; + //@ static invariant A != B; + //@ static invariant A != C; + //@ static invariant B != C; //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); public static final SimpleEnum A = new SimpleEnum(); diff --git a/key.core/pipelineTests/enums/expected/18_ConstantStringExpressionEvaluator/SimpleEnum.java b/key.core/pipelineTests/enums/expected/18_ConstantStringExpressionEvaluator/SimpleEnum.java index c72e2eb5a64..a94b03ee05b 100644 --- a/key.core/pipelineTests/enums/expected/18_ConstantStringExpressionEvaluator/SimpleEnum.java +++ b/key.core/pipelineTests/enums/expected/18_ConstantStringExpressionEvaluator/SimpleEnum.java @@ -1,5 +1,8 @@ public final class SimpleEnum extends Enum { - //@ static invariant A == null && B == null && C == null; + //@ static invariant A != null && B != null && C != null; + //@ static invariant A != B; + //@ static invariant A != C; + //@ static invariant B != C; //@ static invariant (\forall SimpleEnum x; A == x || B == x || C == x); public static final SimpleEnum A = new SimpleEnum(); diff --git a/key.core/pipelineTests/innerclass/expected/04_EnumClassAccessExplicit/MostSimpleInner.java b/key.core/pipelineTests/innerclass/expected/04_EnumClassAccessExplicit/MostSimpleInner.java new file mode 100644 index 00000000000..a7764c2a007 --- /dev/null +++ b/key.core/pipelineTests/innerclass/expected/04_EnumClassAccessExplicit/MostSimpleInner.java @@ -0,0 +1,5 @@ +public class MostSimpleInner { + + public static class MyInnerClass { + } +} diff --git a/key.core/pipelineTests/innerclass/expected/05_EnumClassBuilder/MostSimpleInner.java b/key.core/pipelineTests/innerclass/expected/05_EnumClassBuilder/MostSimpleInner.java new file mode 100644 index 00000000000..a7764c2a007 --- /dev/null +++ b/key.core/pipelineTests/innerclass/expected/05_EnumClassBuilder/MostSimpleInner.java @@ -0,0 +1,5 @@ +public class MostSimpleInner { + + public static class MyInnerClass { + } +} diff --git a/key.core/pipelineTests/innerclass/expected/06_RecordClassBuilder/MostSimpleInner.java b/key.core/pipelineTests/innerclass/expected/06_RecordClassBuilder/MostSimpleInner.java new file mode 100644 index 00000000000..a7764c2a007 --- /dev/null +++ b/key.core/pipelineTests/innerclass/expected/06_RecordClassBuilder/MostSimpleInner.java @@ -0,0 +1,5 @@ +public class MostSimpleInner { + + public static class MyInnerClass { + } +} diff --git a/key.core/pipelineTests/innerclass/expected/07_JMLTransformer/MostSimpleInner.java b/key.core/pipelineTests/innerclass/expected/07_JMLTransformer/MostSimpleInner.java new file mode 100644 index 00000000000..a7764c2a007 --- /dev/null +++ b/key.core/pipelineTests/innerclass/expected/07_JMLTransformer/MostSimpleInner.java @@ -0,0 +1,5 @@ +public class MostSimpleInner { + + public static class MyInnerClass { + } +} diff --git a/key.core/pipelineTests/innerclass/expected/08_JmlDocRemoval/MostSimpleInner.java b/key.core/pipelineTests/innerclass/expected/08_JmlDocRemoval/MostSimpleInner.java new file mode 100644 index 00000000000..a7764c2a007 --- /dev/null +++ b/key.core/pipelineTests/innerclass/expected/08_JmlDocRemoval/MostSimpleInner.java @@ -0,0 +1,5 @@ +public class MostSimpleInner { + + public static class MyInnerClass { + } +} diff --git a/key.core/pipelineTests/innerclass/expected/09_ImplicitFieldAdder/MostSimpleInner.java b/key.core/pipelineTests/innerclass/expected/09_ImplicitFieldAdder/MostSimpleInner.java new file mode 100644 index 00000000000..ae893d9a18f --- /dev/null +++ b/key.core/pipelineTests/innerclass/expected/09_ImplicitFieldAdder/MostSimpleInner.java @@ -0,0 +1,41 @@ +public class MostSimpleInner { + + public static class MyInnerClass { + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; +} diff --git a/key.core/pipelineTests/innerclass/expected/10_InstanceAllocationMethodBuilder/MostSimpleInner.java b/key.core/pipelineTests/innerclass/expected/10_InstanceAllocationMethodBuilder/MostSimpleInner.java new file mode 100644 index 00000000000..cbb206f2577 --- /dev/null +++ b/key.core/pipelineTests/innerclass/expected/10_InstanceAllocationMethodBuilder/MostSimpleInner.java @@ -0,0 +1,45 @@ +public class MostSimpleInner { + + public static class MyInnerClass { + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyInnerClass $allocate(); + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MostSimpleInner $allocate(); +} diff --git a/key.core/pipelineTests/innerclass/expected/11_ConstructorNormalformBuilder/MostSimpleInner.java b/key.core/pipelineTests/innerclass/expected/11_ConstructorNormalformBuilder/MostSimpleInner.java new file mode 100644 index 00000000000..59fd6e1b318 --- /dev/null +++ b/key.core/pipelineTests/innerclass/expected/11_ConstructorNormalformBuilder/MostSimpleInner.java @@ -0,0 +1,61 @@ +public class MostSimpleInner { + + public static class MyInnerClass { + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyInnerClass $allocate(); + + public MyInnerClass() { + } + + public void $init() { + super.$init(); + super.$init(); + } + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MostSimpleInner $allocate(); + + public MostSimpleInner() { + } + + public void $init() { + super.$init(); + super.$init(); + } +} diff --git a/key.core/pipelineTests/innerclass/expected/12_ClassPreparationMethodBuilder/MostSimpleInner.java b/key.core/pipelineTests/innerclass/expected/12_ClassPreparationMethodBuilder/MostSimpleInner.java new file mode 100644 index 00000000000..803b9be00b4 --- /dev/null +++ b/key.core/pipelineTests/innerclass/expected/12_ClassPreparationMethodBuilder/MostSimpleInner.java @@ -0,0 +1,67 @@ +public class MostSimpleInner { + + public static class MyInnerClass { + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyInnerClass $allocate(); + + public MyInnerClass() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MostSimpleInner $allocate(); + + public MostSimpleInner() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } +} diff --git a/key.core/pipelineTests/innerclass/expected/13_ClassInitializeMethodBuilder/MostSimpleInner.java b/key.core/pipelineTests/innerclass/expected/13_ClassInitializeMethodBuilder/MostSimpleInner.java new file mode 100644 index 00000000000..3c160373169 --- /dev/null +++ b/key.core/pipelineTests/innerclass/expected/13_ClassInitializeMethodBuilder/MostSimpleInner.java @@ -0,0 +1,143 @@ +public class MostSimpleInner { + + public static class MyInnerClass { + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyInnerClass $allocate(); + + public MyInnerClass() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MostSimpleInner $allocate(); + + public MostSimpleInner() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } +} diff --git a/key.core/pipelineTests/innerclass/expected/14_PrepareObjectBuilder/MostSimpleInner.java b/key.core/pipelineTests/innerclass/expected/14_PrepareObjectBuilder/MostSimpleInner.java new file mode 100644 index 00000000000..b4d0f07a148 --- /dev/null +++ b/key.core/pipelineTests/innerclass/expected/14_PrepareObjectBuilder/MostSimpleInner.java @@ -0,0 +1,159 @@ +public class MostSimpleInner { + + public static class MyInnerClass { + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyInnerClass $allocate(); + + public MyInnerClass() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + } + + private void $prepareEnter() { + super.$prepare(); + } + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MostSimpleInner $allocate(); + + public MostSimpleInner() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + } + + private void $prepareEnter() { + super.$prepare(); + } +} diff --git a/key.core/pipelineTests/innerclass/expected/15_CreateBuilder/MostSimpleInner.java b/key.core/pipelineTests/innerclass/expected/15_CreateBuilder/MostSimpleInner.java new file mode 100644 index 00000000000..3bc13f1ae18 --- /dev/null +++ b/key.core/pipelineTests/innerclass/expected/15_CreateBuilder/MostSimpleInner.java @@ -0,0 +1,173 @@ +public class MostSimpleInner { + + public static class MyInnerClass { + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyInnerClass $allocate(); + + public MyInnerClass() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + } + + private void $prepareEnter() { + super.$prepare(); + } + + public MyInnerClass $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MostSimpleInner $allocate(); + + public MostSimpleInner() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + } + + private void $prepareEnter() { + super.$prepare(); + } + + public MostSimpleInner $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } +} diff --git a/key.core/pipelineTests/innerclass/expected/16_CreateObjectBuilder/MostSimpleInner.java b/key.core/pipelineTests/innerclass/expected/16_CreateObjectBuilder/MostSimpleInner.java new file mode 100644 index 00000000000..decd2bad906 --- /dev/null +++ b/key.core/pipelineTests/innerclass/expected/16_CreateObjectBuilder/MostSimpleInner.java @@ -0,0 +1,189 @@ +public class MostSimpleInner { + + public static class MyInnerClass { + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyInnerClass $allocate(); + + public MyInnerClass() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + } + + private void $prepareEnter() { + super.$prepare(); + } + + public MyInnerClass $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static MyInnerClass $createObject() { + MyInnerClass __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = MyInnerClass.$allocate(); + __NEW__.$create()@MyInnerClass + return __NEW__; + } + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MostSimpleInner $allocate(); + + public MostSimpleInner() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + } + + private void $prepareEnter() { + super.$prepare(); + } + + public MostSimpleInner $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static MostSimpleInner $createObject() { + MostSimpleInner __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = MostSimpleInner.$allocate(); + __NEW__.$create()@MostSimpleInner + return __NEW__; + } +} diff --git a/key.core/pipelineTests/innerclass/expected/17_LocalClassTransformation/MostSimpleInner.java b/key.core/pipelineTests/innerclass/expected/17_LocalClassTransformation/MostSimpleInner.java new file mode 100644 index 00000000000..decd2bad906 --- /dev/null +++ b/key.core/pipelineTests/innerclass/expected/17_LocalClassTransformation/MostSimpleInner.java @@ -0,0 +1,189 @@ +public class MostSimpleInner { + + public static class MyInnerClass { + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyInnerClass $allocate(); + + public MyInnerClass() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + } + + private void $prepareEnter() { + super.$prepare(); + } + + public MyInnerClass $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static MyInnerClass $createObject() { + MyInnerClass __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = MyInnerClass.$allocate(); + __NEW__.$create()@MyInnerClass + return __NEW__; + } + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MostSimpleInner $allocate(); + + public MostSimpleInner() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + } + + private void $prepareEnter() { + super.$prepare(); + } + + public MostSimpleInner $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static MostSimpleInner $createObject() { + MostSimpleInner __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = MostSimpleInner.$allocate(); + __NEW__.$create()@MostSimpleInner + return __NEW__; + } +} diff --git a/key.core/pipelineTests/innerclass/expected/18_ConstantStringExpressionEvaluator/MostSimpleInner.java b/key.core/pipelineTests/innerclass/expected/18_ConstantStringExpressionEvaluator/MostSimpleInner.java new file mode 100644 index 00000000000..decd2bad906 --- /dev/null +++ b/key.core/pipelineTests/innerclass/expected/18_ConstantStringExpressionEvaluator/MostSimpleInner.java @@ -0,0 +1,189 @@ +public class MostSimpleInner { + + public static class MyInnerClass { + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyInnerClass $allocate(); + + public MyInnerClass() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + } + + private void $prepareEnter() { + super.$prepare(); + } + + public MyInnerClass $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static MyInnerClass $createObject() { + MyInnerClass __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = MyInnerClass.$allocate(); + __NEW__.$create()@MyInnerClass + return __NEW__; + } + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MostSimpleInner $allocate(); + + public MostSimpleInner() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + } + + private void $prepareEnter() { + super.$prepare(); + } + + public MostSimpleInner $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static MostSimpleInner $createObject() { + MostSimpleInner __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = MostSimpleInner.$allocate(); + __NEW__.$create()@MostSimpleInner + return __NEW__; + } +} diff --git a/key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/CompactConstructor.java b/key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/CompactConstructor.java new file mode 100644 index 00000000000..7875031d112 --- /dev/null +++ b/key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/CompactConstructor.java @@ -0,0 +1,8 @@ +record Mapping(String from, String to) { + + Mapping { + // compact constructor! + from = "abc"; + to = "def"; + } +} diff --git a/key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/InnerRecord.java b/key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/InnerRecord.java new file mode 100644 index 00000000000..2046d14ecfc --- /dev/null +++ b/key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/InnerRecord.java @@ -0,0 +1,7 @@ +import java.lang.Object; + +public class OuterClass { + + final record MyRecord(String test) { + } +} diff --git a/key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/NotAllowed.java b/key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/NotAllowed.java new file mode 100644 index 00000000000..5941911ccf7 --- /dev/null +++ b/key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/NotAllowed.java @@ -0,0 +1,36 @@ +//https://mikemybytes.com/2022/02/16/java-records-and-compact-constructors/ +record // package-private +Name(// package-private +String name) { + + // fails with: 'invalid canonical constructor in record Name + // (attempting to assign stronger access privileges; + // was package)' + private Name(String name) { + this.name = name; + } + + static Name of(String name) { + return new Name(name); + } +} + +record Point(int x, int y) { + + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + Point(int x) { + // a bit weird... + // ... but perfectly fine for the compiler + this(x, 0); + } + + Point() { + // fails with: 'constructor is not canonical, so its first + // statement must invoke another constructor' + } +} diff --git a/key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/Point3d.java b/key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/Point3d.java new file mode 100644 index 00000000000..cf984e9b6a6 --- /dev/null +++ b/key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/Point3d.java @@ -0,0 +1,2 @@ +record Point3d(int x, int y, int z) { +} diff --git a/key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/RecordOverwriting.java b/key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/RecordOverwriting.java new file mode 100644 index 00000000000..4cffbb21982 --- /dev/null +++ b/key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/RecordOverwriting.java @@ -0,0 +1,14 @@ +record MyRecord(String test) { + + public int hashCode() { + return 0; + } + + public boolean equals(Object obj) { + return obj instanceof MyRecord; + } + + public String test() { + return ""; + } +} diff --git a/key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/SimpleRecord.java b/key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/SimpleRecord.java new file mode 100644 index 00000000000..72c63026dad --- /dev/null +++ b/key.core/pipelineTests/records/expected/04_EnumClassAccessExplicit/SimpleRecord.java @@ -0,0 +1,6 @@ +public record SimpleRecord(/*@ nullable */ String name) implements Serializable { + + SimpleRecord(String name) { + this.name = name; + } +} diff --git a/key.core/pipelineTests/records/expected/05_EnumClassBuilder/CompactConstructor.java b/key.core/pipelineTests/records/expected/05_EnumClassBuilder/CompactConstructor.java new file mode 100644 index 00000000000..7875031d112 --- /dev/null +++ b/key.core/pipelineTests/records/expected/05_EnumClassBuilder/CompactConstructor.java @@ -0,0 +1,8 @@ +record Mapping(String from, String to) { + + Mapping { + // compact constructor! + from = "abc"; + to = "def"; + } +} diff --git a/key.core/pipelineTests/records/expected/05_EnumClassBuilder/InnerRecord.java b/key.core/pipelineTests/records/expected/05_EnumClassBuilder/InnerRecord.java new file mode 100644 index 00000000000..2046d14ecfc --- /dev/null +++ b/key.core/pipelineTests/records/expected/05_EnumClassBuilder/InnerRecord.java @@ -0,0 +1,7 @@ +import java.lang.Object; + +public class OuterClass { + + final record MyRecord(String test) { + } +} diff --git a/key.core/pipelineTests/records/expected/05_EnumClassBuilder/NotAllowed.java b/key.core/pipelineTests/records/expected/05_EnumClassBuilder/NotAllowed.java new file mode 100644 index 00000000000..5941911ccf7 --- /dev/null +++ b/key.core/pipelineTests/records/expected/05_EnumClassBuilder/NotAllowed.java @@ -0,0 +1,36 @@ +//https://mikemybytes.com/2022/02/16/java-records-and-compact-constructors/ +record // package-private +Name(// package-private +String name) { + + // fails with: 'invalid canonical constructor in record Name + // (attempting to assign stronger access privileges; + // was package)' + private Name(String name) { + this.name = name; + } + + static Name of(String name) { + return new Name(name); + } +} + +record Point(int x, int y) { + + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + Point(int x) { + // a bit weird... + // ... but perfectly fine for the compiler + this(x, 0); + } + + Point() { + // fails with: 'constructor is not canonical, so its first + // statement must invoke another constructor' + } +} diff --git a/key.core/pipelineTests/records/expected/05_EnumClassBuilder/Point3d.java b/key.core/pipelineTests/records/expected/05_EnumClassBuilder/Point3d.java new file mode 100644 index 00000000000..cf984e9b6a6 --- /dev/null +++ b/key.core/pipelineTests/records/expected/05_EnumClassBuilder/Point3d.java @@ -0,0 +1,2 @@ +record Point3d(int x, int y, int z) { +} diff --git a/key.core/pipelineTests/records/expected/05_EnumClassBuilder/RecordOverwriting.java b/key.core/pipelineTests/records/expected/05_EnumClassBuilder/RecordOverwriting.java new file mode 100644 index 00000000000..4cffbb21982 --- /dev/null +++ b/key.core/pipelineTests/records/expected/05_EnumClassBuilder/RecordOverwriting.java @@ -0,0 +1,14 @@ +record MyRecord(String test) { + + public int hashCode() { + return 0; + } + + public boolean equals(Object obj) { + return obj instanceof MyRecord; + } + + public String test() { + return ""; + } +} diff --git a/key.core/pipelineTests/records/expected/05_EnumClassBuilder/SimpleRecord.java b/key.core/pipelineTests/records/expected/05_EnumClassBuilder/SimpleRecord.java new file mode 100644 index 00000000000..72c63026dad --- /dev/null +++ b/key.core/pipelineTests/records/expected/05_EnumClassBuilder/SimpleRecord.java @@ -0,0 +1,6 @@ +public record SimpleRecord(/*@ nullable */ String name) implements Serializable { + + SimpleRecord(String name) { + this.name = name; + } +} diff --git a/key.core/pipelineTests/records/expected/06_RecordClassBuilder/CompactConstructor.java b/key.core/pipelineTests/records/expected/06_RecordClassBuilder/CompactConstructor.java new file mode 100644 index 00000000000..e025ccf3c9c --- /dev/null +++ b/key.core/pipelineTests/records/expected/06_RecordClassBuilder/CompactConstructor.java @@ -0,0 +1,66 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Mapping extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String from; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String from() { + return from; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String to; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String to() { + return to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures from == this.from && to == this.to; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Mapping(String from, String to) { + { + // compact constructor! + from = "abc"; + to = "def"; + } + //Created by RecordClassBuilder.java:131 + this.from = from; + //Created by RecordClassBuilder.java:131 + this.to = to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Mapping && o == null && this.from == ((Mapping) o).from && this.to == ((Mapping) o).to) || (o instanceof Mapping && o == null && (this.from == null? (this.from.equals(((Mapping) o).from)) : (o.from == null)) && (this.to == null? (this.to.equals(((Mapping) o).to)) : (o.to == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Mapping[" + "from=" + from + "," + "to=" + to + "]"; + } +} diff --git a/key.core/pipelineTests/records/expected/06_RecordClassBuilder/InnerRecord.java b/key.core/pipelineTests/records/expected/06_RecordClassBuilder/InnerRecord.java new file mode 100644 index 00000000000..6a0f18a5713 --- /dev/null +++ b/key.core/pipelineTests/records/expected/06_RecordClassBuilder/InnerRecord.java @@ -0,0 +1,56 @@ +import java.lang.Object; + +public class OuterClass { + + @javax.annotation.processing.Generated("RecordClassBuilder") + final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String test() { + return test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof MyRecord && o == null && this.test == ((MyRecord) o).test) || (o instanceof MyRecord && o == null && (this.test == null? (this.test.equals(((MyRecord) o).test)) : (o.test == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + } +} diff --git a/key.core/pipelineTests/records/expected/06_RecordClassBuilder/NotAllowed.java b/key.core/pipelineTests/records/expected/06_RecordClassBuilder/NotAllowed.java new file mode 100644 index 00000000000..e24980575b0 --- /dev/null +++ b/key.core/pipelineTests/records/expected/06_RecordClassBuilder/NotAllowed.java @@ -0,0 +1,150 @@ +//https://mikemybytes.com/2022/02/16/java-records-and-compact-constructors/ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class // package-private +Name extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Name && o == null && this.name == ((Name) o).name) || (o instanceof Name && o == null && (this.name == null? (this.name.equals(((Name) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Name[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + static Name of(String name) { + return new Name(name); + } +} + +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point && o == null && this.x == ((Point) o).x && this.y == ((Point) o).y) || (o instanceof Point && o == null && (x == ((Point) o).x) && (y == ((Point) o).y)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point[" + "x=" + x + "," + "y=" + y + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + Point(int x) { + // a bit weird... + // ... but perfectly fine for the compiler + this(x, 0); + } + + Point() { + // fails with: 'constructor is not canonical, so its first + // statement must invoke another constructor' + } +} diff --git a/key.core/pipelineTests/records/expected/06_RecordClassBuilder/Point3d.java b/key.core/pipelineTests/records/expected/06_RecordClassBuilder/Point3d.java new file mode 100644 index 00000000000..57ca946054a --- /dev/null +++ b/key.core/pipelineTests/records/expected/06_RecordClassBuilder/Point3d.java @@ -0,0 +1,71 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point3d extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int z; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int z() { + return z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y && z == this.z; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Point3d(int x, int y, int z) { + //Created by RecordClassBuilder.java:131 + this.x = x; + //Created by RecordClassBuilder.java:131 + this.y = y; + //Created by RecordClassBuilder.java:131 + this.z = z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point3d && o == null && this.x == ((Point3d) o).x && this.y == ((Point3d) o).y && this.z == ((Point3d) o).z) || (o instanceof Point3d && o == null && (x == ((Point3d) o).x) && (y == ((Point3d) o).y) && (z == ((Point3d) o).z)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point3d[" + "x=" + x + "," + "y=" + y + "," + "z=" + z + "]"; + } +} diff --git a/key.core/pipelineTests/records/expected/06_RecordClassBuilder/RecordOverwriting.java b/key.core/pipelineTests/records/expected/06_RecordClassBuilder/RecordOverwriting.java new file mode 100644 index 00000000000..3855634abfb --- /dev/null +++ b/key.core/pipelineTests/records/expected/06_RecordClassBuilder/RecordOverwriting.java @@ -0,0 +1,36 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + public int hashCode() { + return 0; + } + + public boolean equals(Object obj) { + return obj instanceof MyRecord; + } + + public String test() { + return ""; + } +} diff --git a/key.core/pipelineTests/records/expected/06_RecordClassBuilder/SimpleRecord.java b/key.core/pipelineTests/records/expected/06_RecordClassBuilder/SimpleRecord.java new file mode 100644 index 00000000000..8ca64b04d48 --- /dev/null +++ b/key.core/pipelineTests/records/expected/06_RecordClassBuilder/SimpleRecord.java @@ -0,0 +1,59 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +public final class SimpleRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final /*@ nullable */ String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final /*@ nullable */ String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof SimpleRecord && o == null && this.name == ((SimpleRecord) o).name) || (o instanceof SimpleRecord && o == null && (this.name == null? (this.name.equals(((SimpleRecord) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "SimpleRecord[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } +} diff --git a/key.core/pipelineTests/records/expected/07_JMLTransformer/CompactConstructor.java b/key.core/pipelineTests/records/expected/07_JMLTransformer/CompactConstructor.java new file mode 100644 index 00000000000..e025ccf3c9c --- /dev/null +++ b/key.core/pipelineTests/records/expected/07_JMLTransformer/CompactConstructor.java @@ -0,0 +1,66 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Mapping extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String from; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String from() { + return from; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String to; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String to() { + return to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures from == this.from && to == this.to; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Mapping(String from, String to) { + { + // compact constructor! + from = "abc"; + to = "def"; + } + //Created by RecordClassBuilder.java:131 + this.from = from; + //Created by RecordClassBuilder.java:131 + this.to = to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Mapping && o == null && this.from == ((Mapping) o).from && this.to == ((Mapping) o).to) || (o instanceof Mapping && o == null && (this.from == null? (this.from.equals(((Mapping) o).from)) : (o.from == null)) && (this.to == null? (this.to.equals(((Mapping) o).to)) : (o.to == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Mapping[" + "from=" + from + "," + "to=" + to + "]"; + } +} diff --git a/key.core/pipelineTests/records/expected/07_JMLTransformer/InnerRecord.java b/key.core/pipelineTests/records/expected/07_JMLTransformer/InnerRecord.java new file mode 100644 index 00000000000..6a0f18a5713 --- /dev/null +++ b/key.core/pipelineTests/records/expected/07_JMLTransformer/InnerRecord.java @@ -0,0 +1,56 @@ +import java.lang.Object; + +public class OuterClass { + + @javax.annotation.processing.Generated("RecordClassBuilder") + final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String test() { + return test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof MyRecord && o == null && this.test == ((MyRecord) o).test) || (o instanceof MyRecord && o == null && (this.test == null? (this.test.equals(((MyRecord) o).test)) : (o.test == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + } +} diff --git a/key.core/pipelineTests/records/expected/07_JMLTransformer/NotAllowed.java b/key.core/pipelineTests/records/expected/07_JMLTransformer/NotAllowed.java new file mode 100644 index 00000000000..e24980575b0 --- /dev/null +++ b/key.core/pipelineTests/records/expected/07_JMLTransformer/NotAllowed.java @@ -0,0 +1,150 @@ +//https://mikemybytes.com/2022/02/16/java-records-and-compact-constructors/ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class // package-private +Name extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Name && o == null && this.name == ((Name) o).name) || (o instanceof Name && o == null && (this.name == null? (this.name.equals(((Name) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Name[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + static Name of(String name) { + return new Name(name); + } +} + +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point && o == null && this.x == ((Point) o).x && this.y == ((Point) o).y) || (o instanceof Point && o == null && (x == ((Point) o).x) && (y == ((Point) o).y)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point[" + "x=" + x + "," + "y=" + y + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + Point(int x) { + // a bit weird... + // ... but perfectly fine for the compiler + this(x, 0); + } + + Point() { + // fails with: 'constructor is not canonical, so its first + // statement must invoke another constructor' + } +} diff --git a/key.core/pipelineTests/records/expected/07_JMLTransformer/Point3d.java b/key.core/pipelineTests/records/expected/07_JMLTransformer/Point3d.java new file mode 100644 index 00000000000..57ca946054a --- /dev/null +++ b/key.core/pipelineTests/records/expected/07_JMLTransformer/Point3d.java @@ -0,0 +1,71 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point3d extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int z; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int z() { + return z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y && z == this.z; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Point3d(int x, int y, int z) { + //Created by RecordClassBuilder.java:131 + this.x = x; + //Created by RecordClassBuilder.java:131 + this.y = y; + //Created by RecordClassBuilder.java:131 + this.z = z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point3d && o == null && this.x == ((Point3d) o).x && this.y == ((Point3d) o).y && this.z == ((Point3d) o).z) || (o instanceof Point3d && o == null && (x == ((Point3d) o).x) && (y == ((Point3d) o).y) && (z == ((Point3d) o).z)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point3d[" + "x=" + x + "," + "y=" + y + "," + "z=" + z + "]"; + } +} diff --git a/key.core/pipelineTests/records/expected/07_JMLTransformer/RecordOverwriting.java b/key.core/pipelineTests/records/expected/07_JMLTransformer/RecordOverwriting.java new file mode 100644 index 00000000000..3855634abfb --- /dev/null +++ b/key.core/pipelineTests/records/expected/07_JMLTransformer/RecordOverwriting.java @@ -0,0 +1,36 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + public int hashCode() { + return 0; + } + + public boolean equals(Object obj) { + return obj instanceof MyRecord; + } + + public String test() { + return ""; + } +} diff --git a/key.core/pipelineTests/records/expected/07_JMLTransformer/SimpleRecord.java b/key.core/pipelineTests/records/expected/07_JMLTransformer/SimpleRecord.java new file mode 100644 index 00000000000..96b71909246 --- /dev/null +++ b/key.core/pipelineTests/records/expected/07_JMLTransformer/SimpleRecord.java @@ -0,0 +1,59 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +public final class SimpleRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final /*@ nullable */ nullable String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final /*@ nullable */ nullable String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof SimpleRecord && o == null && this.name == ((SimpleRecord) o).name) || (o instanceof SimpleRecord && o == null && (this.name == null? (this.name.equals(((SimpleRecord) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "SimpleRecord[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } +} diff --git a/key.core/pipelineTests/records/expected/08_JmlDocRemoval/CompactConstructor.java b/key.core/pipelineTests/records/expected/08_JmlDocRemoval/CompactConstructor.java new file mode 100644 index 00000000000..e025ccf3c9c --- /dev/null +++ b/key.core/pipelineTests/records/expected/08_JmlDocRemoval/CompactConstructor.java @@ -0,0 +1,66 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Mapping extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String from; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String from() { + return from; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String to; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String to() { + return to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures from == this.from && to == this.to; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Mapping(String from, String to) { + { + // compact constructor! + from = "abc"; + to = "def"; + } + //Created by RecordClassBuilder.java:131 + this.from = from; + //Created by RecordClassBuilder.java:131 + this.to = to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Mapping && o == null && this.from == ((Mapping) o).from && this.to == ((Mapping) o).to) || (o instanceof Mapping && o == null && (this.from == null? (this.from.equals(((Mapping) o).from)) : (o.from == null)) && (this.to == null? (this.to.equals(((Mapping) o).to)) : (o.to == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Mapping[" + "from=" + from + "," + "to=" + to + "]"; + } +} diff --git a/key.core/pipelineTests/records/expected/08_JmlDocRemoval/InnerRecord.java b/key.core/pipelineTests/records/expected/08_JmlDocRemoval/InnerRecord.java new file mode 100644 index 00000000000..6a0f18a5713 --- /dev/null +++ b/key.core/pipelineTests/records/expected/08_JmlDocRemoval/InnerRecord.java @@ -0,0 +1,56 @@ +import java.lang.Object; + +public class OuterClass { + + @javax.annotation.processing.Generated("RecordClassBuilder") + final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String test() { + return test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof MyRecord && o == null && this.test == ((MyRecord) o).test) || (o instanceof MyRecord && o == null && (this.test == null? (this.test.equals(((MyRecord) o).test)) : (o.test == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + } +} diff --git a/key.core/pipelineTests/records/expected/08_JmlDocRemoval/NotAllowed.java b/key.core/pipelineTests/records/expected/08_JmlDocRemoval/NotAllowed.java new file mode 100644 index 00000000000..e24980575b0 --- /dev/null +++ b/key.core/pipelineTests/records/expected/08_JmlDocRemoval/NotAllowed.java @@ -0,0 +1,150 @@ +//https://mikemybytes.com/2022/02/16/java-records-and-compact-constructors/ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class // package-private +Name extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Name && o == null && this.name == ((Name) o).name) || (o instanceof Name && o == null && (this.name == null? (this.name.equals(((Name) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Name[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + static Name of(String name) { + return new Name(name); + } +} + +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point && o == null && this.x == ((Point) o).x && this.y == ((Point) o).y) || (o instanceof Point && o == null && (x == ((Point) o).x) && (y == ((Point) o).y)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point[" + "x=" + x + "," + "y=" + y + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + Point(int x) { + // a bit weird... + // ... but perfectly fine for the compiler + this(x, 0); + } + + Point() { + // fails with: 'constructor is not canonical, so its first + // statement must invoke another constructor' + } +} diff --git a/key.core/pipelineTests/records/expected/08_JmlDocRemoval/Point3d.java b/key.core/pipelineTests/records/expected/08_JmlDocRemoval/Point3d.java new file mode 100644 index 00000000000..57ca946054a --- /dev/null +++ b/key.core/pipelineTests/records/expected/08_JmlDocRemoval/Point3d.java @@ -0,0 +1,71 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point3d extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int z; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int z() { + return z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y && z == this.z; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Point3d(int x, int y, int z) { + //Created by RecordClassBuilder.java:131 + this.x = x; + //Created by RecordClassBuilder.java:131 + this.y = y; + //Created by RecordClassBuilder.java:131 + this.z = z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point3d && o == null && this.x == ((Point3d) o).x && this.y == ((Point3d) o).y && this.z == ((Point3d) o).z) || (o instanceof Point3d && o == null && (x == ((Point3d) o).x) && (y == ((Point3d) o).y) && (z == ((Point3d) o).z)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point3d[" + "x=" + x + "," + "y=" + y + "," + "z=" + z + "]"; + } +} diff --git a/key.core/pipelineTests/records/expected/08_JmlDocRemoval/RecordOverwriting.java b/key.core/pipelineTests/records/expected/08_JmlDocRemoval/RecordOverwriting.java new file mode 100644 index 00000000000..3855634abfb --- /dev/null +++ b/key.core/pipelineTests/records/expected/08_JmlDocRemoval/RecordOverwriting.java @@ -0,0 +1,36 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + public int hashCode() { + return 0; + } + + public boolean equals(Object obj) { + return obj instanceof MyRecord; + } + + public String test() { + return ""; + } +} diff --git a/key.core/pipelineTests/records/expected/08_JmlDocRemoval/SimpleRecord.java b/key.core/pipelineTests/records/expected/08_JmlDocRemoval/SimpleRecord.java new file mode 100644 index 00000000000..078bdc6b68f --- /dev/null +++ b/key.core/pipelineTests/records/expected/08_JmlDocRemoval/SimpleRecord.java @@ -0,0 +1,59 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +public final class SimpleRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final nullable String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final nullable String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof SimpleRecord && o == null && this.name == ((SimpleRecord) o).name) || (o instanceof SimpleRecord && o == null && (this.name == null? (this.name.equals(((SimpleRecord) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "SimpleRecord[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } +} diff --git a/key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/CompactConstructor.java b/key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/CompactConstructor.java new file mode 100644 index 00000000000..e1c3a521c88 --- /dev/null +++ b/key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/CompactConstructor.java @@ -0,0 +1,84 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Mapping extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String from; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String from() { + return from; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String to; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String to() { + return to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures from == this.from && to == this.to; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Mapping(String from, String to) { + { + // compact constructor! + from = "abc"; + to = "def"; + } + //Created by RecordClassBuilder.java:131 + this.from = from; + //Created by RecordClassBuilder.java:131 + this.to = to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Mapping && o == null && this.from == ((Mapping) o).from && this.to == ((Mapping) o).to) || (o instanceof Mapping && o == null && (this.from == null? (this.from.equals(((Mapping) o).from)) : (o.from == null)) && (this.to == null? (this.to.equals(((Mapping) o).to)) : (o.to == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Mapping[" + "from=" + from + "," + "to=" + to + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; +} diff --git a/key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/InnerRecord.java b/key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/InnerRecord.java new file mode 100644 index 00000000000..68cc41744d9 --- /dev/null +++ b/key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/InnerRecord.java @@ -0,0 +1,94 @@ +import java.lang.Object; + +public class OuterClass { + + @javax.annotation.processing.Generated("RecordClassBuilder") + final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String test() { + return test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof MyRecord && o == null && this.test == ((MyRecord) o).test) || (o instanceof MyRecord && o == null && (this.test == null? (this.test.equals(((MyRecord) o).test)) : (o.test == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + private OuterClass $enclosingThis; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; +} diff --git a/key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/NotAllowed.java b/key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/NotAllowed.java new file mode 100644 index 00000000000..230306fea93 --- /dev/null +++ b/key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/NotAllowed.java @@ -0,0 +1,186 @@ +//https://mikemybytes.com/2022/02/16/java-records-and-compact-constructors/ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class // package-private +Name extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Name && o == null && this.name == ((Name) o).name) || (o instanceof Name && o == null && (this.name == null? (this.name.equals(((Name) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Name[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + static Name of(String name) { + return new Name(name); + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; +} + +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point && o == null && this.x == ((Point) o).x && this.y == ((Point) o).y) || (o instanceof Point && o == null && (x == ((Point) o).x) && (y == ((Point) o).y)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point[" + "x=" + x + "," + "y=" + y + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + Point(int x) { + // a bit weird... + // ... but perfectly fine for the compiler + this(x, 0); + } + + Point() { + // fails with: 'constructor is not canonical, so its first + // statement must invoke another constructor' + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; +} diff --git a/key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/Point3d.java b/key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/Point3d.java new file mode 100644 index 00000000000..b9493890596 --- /dev/null +++ b/key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/Point3d.java @@ -0,0 +1,89 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point3d extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int z; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int z() { + return z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y && z == this.z; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Point3d(int x, int y, int z) { + //Created by RecordClassBuilder.java:131 + this.x = x; + //Created by RecordClassBuilder.java:131 + this.y = y; + //Created by RecordClassBuilder.java:131 + this.z = z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point3d && o == null && this.x == ((Point3d) o).x && this.y == ((Point3d) o).y && this.z == ((Point3d) o).z) || (o instanceof Point3d && o == null && (x == ((Point3d) o).x) && (y == ((Point3d) o).y) && (z == ((Point3d) o).z)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point3d[" + "x=" + x + "," + "y=" + y + "," + "z=" + z + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; +} diff --git a/key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/RecordOverwriting.java b/key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/RecordOverwriting.java new file mode 100644 index 00000000000..f9a587af522 --- /dev/null +++ b/key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/RecordOverwriting.java @@ -0,0 +1,54 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + public int hashCode() { + return 0; + } + + public boolean equals(Object obj) { + return obj instanceof MyRecord; + } + + public String test() { + return ""; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; +} diff --git a/key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/SimpleRecord.java b/key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/SimpleRecord.java new file mode 100644 index 00000000000..1a3aba6eea0 --- /dev/null +++ b/key.core/pipelineTests/records/expected/09_ImplicitFieldAdder/SimpleRecord.java @@ -0,0 +1,77 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +public final class SimpleRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final nullable String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final nullable String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof SimpleRecord && o == null && this.name == ((SimpleRecord) o).name) || (o instanceof SimpleRecord && o == null && (this.name == null? (this.name.equals(((SimpleRecord) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "SimpleRecord[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; +} diff --git a/key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/CompactConstructor.java b/key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/CompactConstructor.java new file mode 100644 index 00000000000..fc186802964 --- /dev/null +++ b/key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/CompactConstructor.java @@ -0,0 +1,86 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Mapping extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String from; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String from() { + return from; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String to; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String to() { + return to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures from == this.from && to == this.to; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Mapping(String from, String to) { + { + // compact constructor! + from = "abc"; + to = "def"; + } + //Created by RecordClassBuilder.java:131 + this.from = from; + //Created by RecordClassBuilder.java:131 + this.to = to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Mapping && o == null && this.from == ((Mapping) o).from && this.to == ((Mapping) o).to) || (o instanceof Mapping && o == null && (this.from == null? (this.from.equals(((Mapping) o).from)) : (o.from == null)) && (this.to == null? (this.to.equals(((Mapping) o).to)) : (o.to == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Mapping[" + "from=" + from + "," + "to=" + to + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Mapping $allocate(); +} diff --git a/key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/InnerRecord.java b/key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/InnerRecord.java new file mode 100644 index 00000000000..7524ddc0c99 --- /dev/null +++ b/key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/InnerRecord.java @@ -0,0 +1,98 @@ +import java.lang.Object; + +public class OuterClass { + + @javax.annotation.processing.Generated("RecordClassBuilder") + final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String test() { + return test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof MyRecord && o == null && this.test == ((MyRecord) o).test) || (o instanceof MyRecord && o == null && (this.test == null? (this.test.equals(((MyRecord) o).test)) : (o.test == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + private OuterClass $enclosingThis; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyRecord $allocate(); + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static OuterClass $allocate(); +} diff --git a/key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/NotAllowed.java b/key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/NotAllowed.java new file mode 100644 index 00000000000..5b781dbc564 --- /dev/null +++ b/key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/NotAllowed.java @@ -0,0 +1,191 @@ +//https://mikemybytes.com/2022/02/16/java-records-and-compact-constructors/ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class // package-private +Name extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Name && o == null && this.name == ((Name) o).name) || (o instanceof Name && o == null && (this.name == null? (this.name.equals(((Name) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Name[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + static Name of(String name) { + return new Name(name); + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static // package-private + Name $allocate(); +} + +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point && o == null && this.x == ((Point) o).x && this.y == ((Point) o).y) || (o instanceof Point && o == null && (x == ((Point) o).x) && (y == ((Point) o).y)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point[" + "x=" + x + "," + "y=" + y + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + Point(int x) { + // a bit weird... + // ... but perfectly fine for the compiler + this(x, 0); + } + + Point() { + // fails with: 'constructor is not canonical, so its first + // statement must invoke another constructor' + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Point $allocate(); +} diff --git a/key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/Point3d.java b/key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/Point3d.java new file mode 100644 index 00000000000..eebbf0b31eb --- /dev/null +++ b/key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/Point3d.java @@ -0,0 +1,91 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point3d extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int z; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int z() { + return z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y && z == this.z; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Point3d(int x, int y, int z) { + //Created by RecordClassBuilder.java:131 + this.x = x; + //Created by RecordClassBuilder.java:131 + this.y = y; + //Created by RecordClassBuilder.java:131 + this.z = z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point3d && o == null && this.x == ((Point3d) o).x && this.y == ((Point3d) o).y && this.z == ((Point3d) o).z) || (o instanceof Point3d && o == null && (x == ((Point3d) o).x) && (y == ((Point3d) o).y) && (z == ((Point3d) o).z)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point3d[" + "x=" + x + "," + "y=" + y + "," + "z=" + z + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Point3d $allocate(); +} diff --git a/key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/RecordOverwriting.java b/key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/RecordOverwriting.java new file mode 100644 index 00000000000..19dfabeaeda --- /dev/null +++ b/key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/RecordOverwriting.java @@ -0,0 +1,56 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + public int hashCode() { + return 0; + } + + public boolean equals(Object obj) { + return obj instanceof MyRecord; + } + + public String test() { + return ""; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyRecord $allocate(); +} diff --git a/key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/SimpleRecord.java b/key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/SimpleRecord.java new file mode 100644 index 00000000000..2770c420e89 --- /dev/null +++ b/key.core/pipelineTests/records/expected/10_InstanceAllocationMethodBuilder/SimpleRecord.java @@ -0,0 +1,79 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +public final class SimpleRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final nullable String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final nullable String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof SimpleRecord && o == null && this.name == ((SimpleRecord) o).name) || (o instanceof SimpleRecord && o == null && (this.name == null? (this.name.equals(((SimpleRecord) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "SimpleRecord[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SimpleRecord $allocate(); +} diff --git a/key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/CompactConstructor.java b/key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/CompactConstructor.java new file mode 100644 index 00000000000..fc92bececca --- /dev/null +++ b/key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/CompactConstructor.java @@ -0,0 +1,99 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Mapping extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String from; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String from() { + return from; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String to; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String to() { + return to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures from == this.from && to == this.to; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Mapping(String from, String to) { + { + // compact constructor! + from = "abc"; + to = "def"; + } + //Created by RecordClassBuilder.java:131 + this.from = from; + //Created by RecordClassBuilder.java:131 + this.to = to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Mapping && o == null && this.from == ((Mapping) o).from && this.to == ((Mapping) o).to) || (o instanceof Mapping && o == null && (this.from == null? (this.from.equals(((Mapping) o).from)) : (o.from == null)) && (this.to == null? (this.to.equals(((Mapping) o).to)) : (o.to == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Mapping[" + "from=" + from + "," + "to=" + to + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Mapping $allocate(); + + public void $init(String from, String to) { + super.$init(); + { + // compact constructor! + from = "abc"; + to = "def"; + } + //Created by RecordClassBuilder.java:131 + this.from = from; + //Created by RecordClassBuilder.java:131 + this.to = to; + } +} diff --git a/key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/InnerRecord.java b/key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/InnerRecord.java new file mode 100644 index 00000000000..d57bd0f3df1 --- /dev/null +++ b/key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/InnerRecord.java @@ -0,0 +1,113 @@ +import java.lang.Object; + +public class OuterClass { + + @javax.annotation.processing.Generated("RecordClassBuilder") + final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String test() { + return test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof MyRecord && o == null && this.test == ((MyRecord) o).test) || (o instanceof MyRecord && o == null && (this.test == null? (this.test.equals(((MyRecord) o).test)) : (o.test == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + private OuterClass $enclosingThis; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyRecord $allocate(); + + public void $init(String test, OuterClass $ENCLOSING_THIS) { + super.$init(); + this.$enclosingThis = $ENCLOSING_THIS; + //Created by RecordClassBuilder.java:131 + this.test = test; + } + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static OuterClass $allocate(); + + public OuterClass() { + } + + public void $init() { + super.$init(); + super.$init(); + } +} diff --git a/key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/NotAllowed.java b/key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/NotAllowed.java new file mode 100644 index 00000000000..6e8d125d2e5 --- /dev/null +++ b/key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/NotAllowed.java @@ -0,0 +1,223 @@ +//https://mikemybytes.com/2022/02/16/java-records-and-compact-constructors/ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class // package-private +Name extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Name && o == null && this.name == ((Name) o).name) || (o instanceof Name && o == null && (this.name == null? (this.name.equals(((Name) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Name[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + static Name of(String name) { + return new Name(name); + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static // package-private + Name $allocate(); + + private void $init(String name) { + super.$init(); + this.name = name; + } + + private void $init(String name) { + super.$init(); + this.name = name; + } +} + +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point && o == null && this.x == ((Point) o).x && this.y == ((Point) o).y) || (o instanceof Point && o == null && (x == ((Point) o).x) && (y == ((Point) o).y)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point[" + "x=" + x + "," + "y=" + y + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + Point(int x) { + // a bit weird... + // ... but perfectly fine for the compiler + this(x, 0); + } + + Point() { + // fails with: 'constructor is not canonical, so its first + // statement must invoke another constructor' + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Point $allocate(); + + void $init(int x, int y) { + super.$init(); + // boring! + this.x = x; + this.y = y; + } + + void $init(int x, int y) { + super.$init(); + // boring! + this.x = x; + this.y = y; + } + + void $init(int x) { + this.$init(x, 0); + } + + void $init() { + super.$init(); + } +} diff --git a/key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/Point3d.java b/key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/Point3d.java new file mode 100644 index 00000000000..877b658f071 --- /dev/null +++ b/key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/Point3d.java @@ -0,0 +1,101 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point3d extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int z; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int z() { + return z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y && z == this.z; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Point3d(int x, int y, int z) { + //Created by RecordClassBuilder.java:131 + this.x = x; + //Created by RecordClassBuilder.java:131 + this.y = y; + //Created by RecordClassBuilder.java:131 + this.z = z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point3d && o == null && this.x == ((Point3d) o).x && this.y == ((Point3d) o).y && this.z == ((Point3d) o).z) || (o instanceof Point3d && o == null && (x == ((Point3d) o).x) && (y == ((Point3d) o).y) && (z == ((Point3d) o).z)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point3d[" + "x=" + x + "," + "y=" + y + "," + "z=" + z + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Point3d $allocate(); + + public void $init(int x, int y, int z) { + super.$init(); + //Created by RecordClassBuilder.java:131 + this.x = x; + //Created by RecordClassBuilder.java:131 + this.y = y; + //Created by RecordClassBuilder.java:131 + this.z = z; + } +} diff --git a/key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/RecordOverwriting.java b/key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/RecordOverwriting.java new file mode 100644 index 00000000000..c7ef795a98f --- /dev/null +++ b/key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/RecordOverwriting.java @@ -0,0 +1,62 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + public int hashCode() { + return 0; + } + + public boolean equals(Object obj) { + return obj instanceof MyRecord; + } + + public String test() { + return ""; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyRecord $allocate(); + + public void $init(String test) { + super.$init(); + //Created by RecordClassBuilder.java:131 + this.test = test; + } +} diff --git a/key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/SimpleRecord.java b/key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/SimpleRecord.java new file mode 100644 index 00000000000..c1b6d559752 --- /dev/null +++ b/key.core/pipelineTests/records/expected/11_ConstructorNormalformBuilder/SimpleRecord.java @@ -0,0 +1,89 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +public final class SimpleRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final nullable String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final nullable String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof SimpleRecord && o == null && this.name == ((SimpleRecord) o).name) || (o instanceof SimpleRecord && o == null && (this.name == null? (this.name.equals(((SimpleRecord) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "SimpleRecord[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SimpleRecord $allocate(); + + void $init(String name) { + super.$init(); + this.name = name; + } + + void $init(String name) { + super.$init(); + this.name = name; + } +} diff --git a/key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/CompactConstructor.java b/key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/CompactConstructor.java new file mode 100644 index 00000000000..8680706dd0d --- /dev/null +++ b/key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/CompactConstructor.java @@ -0,0 +1,102 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Mapping extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String from; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String from() { + return from; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String to; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String to() { + return to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures from == this.from && to == this.to; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Mapping(String from, String to) { + { + // compact constructor! + from = "abc"; + to = "def"; + } + //Created by RecordClassBuilder.java:131 + this.from = from; + //Created by RecordClassBuilder.java:131 + this.to = to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Mapping && o == null && this.from == ((Mapping) o).from && this.to == ((Mapping) o).to) || (o instanceof Mapping && o == null && (this.from == null? (this.from.equals(((Mapping) o).from)) : (o.from == null)) && (this.to == null? (this.to.equals(((Mapping) o).to)) : (o.to == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Mapping[" + "from=" + from + "," + "to=" + to + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Mapping $allocate(); + + public void $init(String from, String to) { + super.$init(); + { + // compact constructor! + from = "abc"; + to = "def"; + } + //Created by RecordClassBuilder.java:131 + this.from = from; + //Created by RecordClassBuilder.java:131 + this.to = to; + } + + static private void $clprepare() { + } +} diff --git a/key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/InnerRecord.java b/key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/InnerRecord.java new file mode 100644 index 00000000000..5343de77652 --- /dev/null +++ b/key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/InnerRecord.java @@ -0,0 +1,119 @@ +import java.lang.Object; + +public class OuterClass { + + @javax.annotation.processing.Generated("RecordClassBuilder") + final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String test() { + return test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof MyRecord && o == null && this.test == ((MyRecord) o).test) || (o instanceof MyRecord && o == null && (this.test == null? (this.test.equals(((MyRecord) o).test)) : (o.test == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + private OuterClass $enclosingThis; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyRecord $allocate(); + + public void $init(String test, OuterClass $ENCLOSING_THIS) { + super.$init(); + this.$enclosingThis = $ENCLOSING_THIS; + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + static private void $clprepare() { + } + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static OuterClass $allocate(); + + public OuterClass() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } +} diff --git a/key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/NotAllowed.java b/key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/NotAllowed.java new file mode 100644 index 00000000000..4a627f614e6 --- /dev/null +++ b/key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/NotAllowed.java @@ -0,0 +1,229 @@ +//https://mikemybytes.com/2022/02/16/java-records-and-compact-constructors/ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class // package-private +Name extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Name && o == null && this.name == ((Name) o).name) || (o instanceof Name && o == null && (this.name == null? (this.name.equals(((Name) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Name[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + static Name of(String name) { + return new Name(name); + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static // package-private + Name $allocate(); + + private void $init(String name) { + super.$init(); + this.name = name; + } + + private void $init(String name) { + super.$init(); + this.name = name; + } + + static private void $clprepare() { + } +} + +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point && o == null && this.x == ((Point) o).x && this.y == ((Point) o).y) || (o instanceof Point && o == null && (x == ((Point) o).x) && (y == ((Point) o).y)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point[" + "x=" + x + "," + "y=" + y + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + Point(int x) { + // a bit weird... + // ... but perfectly fine for the compiler + this(x, 0); + } + + Point() { + // fails with: 'constructor is not canonical, so its first + // statement must invoke another constructor' + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Point $allocate(); + + void $init(int x, int y) { + super.$init(); + // boring! + this.x = x; + this.y = y; + } + + void $init(int x, int y) { + super.$init(); + // boring! + this.x = x; + this.y = y; + } + + void $init(int x) { + this.$init(x, 0); + } + + void $init() { + super.$init(); + } + + static private void $clprepare() { + } +} diff --git a/key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/Point3d.java b/key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/Point3d.java new file mode 100644 index 00000000000..405663186f2 --- /dev/null +++ b/key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/Point3d.java @@ -0,0 +1,104 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point3d extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int z; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int z() { + return z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y && z == this.z; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Point3d(int x, int y, int z) { + //Created by RecordClassBuilder.java:131 + this.x = x; + //Created by RecordClassBuilder.java:131 + this.y = y; + //Created by RecordClassBuilder.java:131 + this.z = z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point3d && o == null && this.x == ((Point3d) o).x && this.y == ((Point3d) o).y && this.z == ((Point3d) o).z) || (o instanceof Point3d && o == null && (x == ((Point3d) o).x) && (y == ((Point3d) o).y) && (z == ((Point3d) o).z)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point3d[" + "x=" + x + "," + "y=" + y + "," + "z=" + z + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Point3d $allocate(); + + public void $init(int x, int y, int z) { + super.$init(); + //Created by RecordClassBuilder.java:131 + this.x = x; + //Created by RecordClassBuilder.java:131 + this.y = y; + //Created by RecordClassBuilder.java:131 + this.z = z; + } + + static private void $clprepare() { + } +} diff --git a/key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/RecordOverwriting.java b/key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/RecordOverwriting.java new file mode 100644 index 00000000000..78bcc964375 --- /dev/null +++ b/key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/RecordOverwriting.java @@ -0,0 +1,65 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + public int hashCode() { + return 0; + } + + public boolean equals(Object obj) { + return obj instanceof MyRecord; + } + + public String test() { + return ""; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyRecord $allocate(); + + public void $init(String test) { + super.$init(); + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + static private void $clprepare() { + } +} diff --git a/key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/SimpleRecord.java b/key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/SimpleRecord.java new file mode 100644 index 00000000000..ec029a6c470 --- /dev/null +++ b/key.core/pipelineTests/records/expected/12_ClassPreparationMethodBuilder/SimpleRecord.java @@ -0,0 +1,92 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +public final class SimpleRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final nullable String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final nullable String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof SimpleRecord && o == null && this.name == ((SimpleRecord) o).name) || (o instanceof SimpleRecord && o == null && (this.name == null? (this.name.equals(((SimpleRecord) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "SimpleRecord[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SimpleRecord $allocate(); + + void $init(String name) { + super.$init(); + this.name = name; + } + + void $init(String name) { + super.$init(); + this.name = name; + } + + static private void $clprepare() { + } +} diff --git a/key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/CompactConstructor.java b/key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/CompactConstructor.java new file mode 100644 index 00000000000..2b52b0658dc --- /dev/null +++ b/key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/CompactConstructor.java @@ -0,0 +1,140 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Mapping extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String from; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String from() { + return from; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String to; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String to() { + return to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures from == this.from && to == this.to; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Mapping(String from, String to) { + { + // compact constructor! + from = "abc"; + to = "def"; + } + //Created by RecordClassBuilder.java:131 + this.from = from; + //Created by RecordClassBuilder.java:131 + this.to = to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Mapping && o == null && this.from == ((Mapping) o).from && this.to == ((Mapping) o).to) || (o instanceof Mapping && o == null && (this.from == null? (this.from.equals(((Mapping) o).from)) : (o.from == null)) && (this.to == null? (this.to.equals(((Mapping) o).to)) : (o.to == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Mapping[" + "from=" + from + "," + "to=" + to + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Mapping $allocate(); + + public void $init(String from, String to) { + super.$init(); + { + // compact constructor! + from = "abc"; + to = "def"; + } + //Created by RecordClassBuilder.java:131 + this.from = from; + //Created by RecordClassBuilder.java:131 + this.to = to; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } +} diff --git a/key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/InnerRecord.java b/key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/InnerRecord.java new file mode 100644 index 00000000000..0bb91a8b64b --- /dev/null +++ b/key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/InnerRecord.java @@ -0,0 +1,195 @@ +import java.lang.Object; + +public class OuterClass { + + @javax.annotation.processing.Generated("RecordClassBuilder") + final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String test() { + return test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof MyRecord && o == null && this.test == ((MyRecord) o).test) || (o instanceof MyRecord && o == null && (this.test == null? (this.test.equals(((MyRecord) o).test)) : (o.test == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + private OuterClass $enclosingThis; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyRecord $allocate(); + + public void $init(String test, OuterClass $ENCLOSING_THIS) { + super.$init(); + this.$enclosingThis = $ENCLOSING_THIS; + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static OuterClass $allocate(); + + public OuterClass() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } +} diff --git a/key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/NotAllowed.java b/key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/NotAllowed.java new file mode 100644 index 00000000000..7c2de807880 --- /dev/null +++ b/key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/NotAllowed.java @@ -0,0 +1,305 @@ +//https://mikemybytes.com/2022/02/16/java-records-and-compact-constructors/ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class // package-private +Name extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Name && o == null && this.name == ((Name) o).name) || (o instanceof Name && o == null && (this.name == null? (this.name.equals(((Name) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Name[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + static Name of(String name) { + return new Name(name); + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static // package-private + Name $allocate(); + + private void $init(String name) { + super.$init(); + this.name = name; + } + + private void $init(String name) { + super.$init(); + this.name = name; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } +} + +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point && o == null && this.x == ((Point) o).x && this.y == ((Point) o).y) || (o instanceof Point && o == null && (x == ((Point) o).x) && (y == ((Point) o).y)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point[" + "x=" + x + "," + "y=" + y + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + Point(int x) { + // a bit weird... + // ... but perfectly fine for the compiler + this(x, 0); + } + + Point() { + // fails with: 'constructor is not canonical, so its first + // statement must invoke another constructor' + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Point $allocate(); + + void $init(int x, int y) { + super.$init(); + // boring! + this.x = x; + this.y = y; + } + + void $init(int x, int y) { + super.$init(); + // boring! + this.x = x; + this.y = y; + } + + void $init(int x) { + this.$init(x, 0); + } + + void $init() { + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } +} diff --git a/key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/Point3d.java b/key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/Point3d.java new file mode 100644 index 00000000000..8de6841caac --- /dev/null +++ b/key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/Point3d.java @@ -0,0 +1,142 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point3d extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int z; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int z() { + return z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y && z == this.z; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Point3d(int x, int y, int z) { + //Created by RecordClassBuilder.java:131 + this.x = x; + //Created by RecordClassBuilder.java:131 + this.y = y; + //Created by RecordClassBuilder.java:131 + this.z = z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point3d && o == null && this.x == ((Point3d) o).x && this.y == ((Point3d) o).y && this.z == ((Point3d) o).z) || (o instanceof Point3d && o == null && (x == ((Point3d) o).x) && (y == ((Point3d) o).y) && (z == ((Point3d) o).z)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point3d[" + "x=" + x + "," + "y=" + y + "," + "z=" + z + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Point3d $allocate(); + + public void $init(int x, int y, int z) { + super.$init(); + //Created by RecordClassBuilder.java:131 + this.x = x; + //Created by RecordClassBuilder.java:131 + this.y = y; + //Created by RecordClassBuilder.java:131 + this.z = z; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } +} diff --git a/key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/RecordOverwriting.java b/key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/RecordOverwriting.java new file mode 100644 index 00000000000..650d3b99e37 --- /dev/null +++ b/key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/RecordOverwriting.java @@ -0,0 +1,103 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + public int hashCode() { + return 0; + } + + public boolean equals(Object obj) { + return obj instanceof MyRecord; + } + + public String test() { + return ""; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyRecord $allocate(); + + public void $init(String test) { + super.$init(); + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } +} diff --git a/key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/SimpleRecord.java b/key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/SimpleRecord.java new file mode 100644 index 00000000000..a1dc322b51e --- /dev/null +++ b/key.core/pipelineTests/records/expected/13_ClassInitializeMethodBuilder/SimpleRecord.java @@ -0,0 +1,130 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +public final class SimpleRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final nullable String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final nullable String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof SimpleRecord && o == null && this.name == ((SimpleRecord) o).name) || (o instanceof SimpleRecord && o == null && (this.name == null? (this.name.equals(((SimpleRecord) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "SimpleRecord[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SimpleRecord $allocate(); + + void $init(String name) { + super.$init(); + this.name = name; + } + + void $init(String name) { + super.$init(); + this.name = name; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } +} diff --git a/key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/CompactConstructor.java b/key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/CompactConstructor.java new file mode 100644 index 00000000000..389f48ba02a --- /dev/null +++ b/key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/CompactConstructor.java @@ -0,0 +1,156 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Mapping extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String from; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String from() { + return from; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String to; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String to() { + return to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures from == this.from && to == this.to; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Mapping(String from, String to) { + { + // compact constructor! + from = "abc"; + to = "def"; + } + //Created by RecordClassBuilder.java:131 + this.from = from; + //Created by RecordClassBuilder.java:131 + this.to = to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Mapping && o == null && this.from == ((Mapping) o).from && this.to == ((Mapping) o).to) || (o instanceof Mapping && o == null && (this.from == null? (this.from.equals(((Mapping) o).from)) : (o.from == null)) && (this.to == null? (this.to.equals(((Mapping) o).to)) : (o.to == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Mapping[" + "from=" + from + "," + "to=" + to + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Mapping $allocate(); + + public void $init(String from, String to) { + super.$init(); + { + // compact constructor! + from = "abc"; + to = "def"; + } + //Created by RecordClassBuilder.java:131 + this.from = from; + //Created by RecordClassBuilder.java:131 + this.to = to; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.from = null; + //Created by PrepareObjectBuilder.java:94 + this.to = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.from = null; + //Created by PrepareObjectBuilder.java:94 + this.to = null; + } +} diff --git a/key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/InnerRecord.java b/key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/InnerRecord.java new file mode 100644 index 00000000000..77e2f1b4f50 --- /dev/null +++ b/key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/InnerRecord.java @@ -0,0 +1,219 @@ +import java.lang.Object; + +public class OuterClass { + + @javax.annotation.processing.Generated("RecordClassBuilder") + final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String test() { + return test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof MyRecord && o == null && this.test == ((MyRecord) o).test) || (o instanceof MyRecord && o == null && (this.test == null? (this.test.equals(((MyRecord) o).test)) : (o.test == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + private OuterClass $enclosingThis; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyRecord $allocate(); + + public void $init(String test, OuterClass $ENCLOSING_THIS) { + super.$init(); + this.$enclosingThis = $ENCLOSING_THIS; + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.test = null; + //Created by PrepareObjectBuilder.java:94 + this.$enclosingThis = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.test = null; + //Created by PrepareObjectBuilder.java:94 + this.$enclosingThis = null; + } + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static OuterClass $allocate(); + + public OuterClass() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + } + + private void $prepareEnter() { + super.$prepare(); + } +} diff --git a/key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/NotAllowed.java b/key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/NotAllowed.java new file mode 100644 index 00000000000..ed66ca9b67f --- /dev/null +++ b/key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/NotAllowed.java @@ -0,0 +1,333 @@ +//https://mikemybytes.com/2022/02/16/java-records-and-compact-constructors/ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class // package-private +Name extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Name && o == null && this.name == ((Name) o).name) || (o instanceof Name && o == null && (this.name == null? (this.name.equals(((Name) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Name[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + static Name of(String name) { + return new Name(name); + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static // package-private + Name $allocate(); + + private void $init(String name) { + super.$init(); + this.name = name; + } + + private void $init(String name) { + super.$init(); + this.name = name; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.name = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.name = null; + } +} + +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point && o == null && this.x == ((Point) o).x && this.y == ((Point) o).y) || (o instanceof Point && o == null && (x == ((Point) o).x) && (y == ((Point) o).y)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point[" + "x=" + x + "," + "y=" + y + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + Point(int x) { + // a bit weird... + // ... but perfectly fine for the compiler + this(x, 0); + } + + Point() { + // fails with: 'constructor is not canonical, so its first + // statement must invoke another constructor' + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Point $allocate(); + + void $init(int x, int y) { + super.$init(); + // boring! + this.x = x; + this.y = y; + } + + void $init(int x, int y) { + super.$init(); + // boring! + this.x = x; + this.y = y; + } + + void $init(int x) { + this.$init(x, 0); + } + + void $init() { + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.x = 0; + //Created by PrepareObjectBuilder.java:94 + this.y = 0; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.x = 0; + //Created by PrepareObjectBuilder.java:94 + this.y = 0; + } +} diff --git a/key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/Point3d.java b/key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/Point3d.java new file mode 100644 index 00000000000..2c47de74cd1 --- /dev/null +++ b/key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/Point3d.java @@ -0,0 +1,162 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point3d extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int z; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int z() { + return z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y && z == this.z; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Point3d(int x, int y, int z) { + //Created by RecordClassBuilder.java:131 + this.x = x; + //Created by RecordClassBuilder.java:131 + this.y = y; + //Created by RecordClassBuilder.java:131 + this.z = z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point3d && o == null && this.x == ((Point3d) o).x && this.y == ((Point3d) o).y && this.z == ((Point3d) o).z) || (o instanceof Point3d && o == null && (x == ((Point3d) o).x) && (y == ((Point3d) o).y) && (z == ((Point3d) o).z)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point3d[" + "x=" + x + "," + "y=" + y + "," + "z=" + z + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Point3d $allocate(); + + public void $init(int x, int y, int z) { + super.$init(); + //Created by RecordClassBuilder.java:131 + this.x = x; + //Created by RecordClassBuilder.java:131 + this.y = y; + //Created by RecordClassBuilder.java:131 + this.z = z; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.x = 0; + //Created by PrepareObjectBuilder.java:94 + this.y = 0; + //Created by PrepareObjectBuilder.java:94 + this.z = 0; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.x = 0; + //Created by PrepareObjectBuilder.java:94 + this.y = 0; + //Created by PrepareObjectBuilder.java:94 + this.z = 0; + } +} diff --git a/key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/RecordOverwriting.java b/key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/RecordOverwriting.java new file mode 100644 index 00000000000..18d7410da06 --- /dev/null +++ b/key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/RecordOverwriting.java @@ -0,0 +1,115 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + public int hashCode() { + return 0; + } + + public boolean equals(Object obj) { + return obj instanceof MyRecord; + } + + public String test() { + return ""; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyRecord $allocate(); + + public void $init(String test) { + super.$init(); + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.test = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.test = null; + } +} diff --git a/key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/SimpleRecord.java b/key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/SimpleRecord.java new file mode 100644 index 00000000000..ad16913d9b6 --- /dev/null +++ b/key.core/pipelineTests/records/expected/14_PrepareObjectBuilder/SimpleRecord.java @@ -0,0 +1,142 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +public final class SimpleRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final nullable String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final nullable String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof SimpleRecord && o == null && this.name == ((SimpleRecord) o).name) || (o instanceof SimpleRecord && o == null && (this.name == null? (this.name.equals(((SimpleRecord) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "SimpleRecord[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SimpleRecord $allocate(); + + void $init(String name) { + super.$init(); + this.name = name; + } + + void $init(String name) { + super.$init(); + this.name = name; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.name = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.name = null; + } +} diff --git a/key.core/pipelineTests/records/expected/15_CreateBuilder/CompactConstructor.java b/key.core/pipelineTests/records/expected/15_CreateBuilder/CompactConstructor.java new file mode 100644 index 00000000000..efa6174b66d --- /dev/null +++ b/key.core/pipelineTests/records/expected/15_CreateBuilder/CompactConstructor.java @@ -0,0 +1,163 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Mapping extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String from; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String from() { + return from; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String to; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String to() { + return to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures from == this.from && to == this.to; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Mapping(String from, String to) { + { + // compact constructor! + from = "abc"; + to = "def"; + } + //Created by RecordClassBuilder.java:131 + this.from = from; + //Created by RecordClassBuilder.java:131 + this.to = to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Mapping && o == null && this.from == ((Mapping) o).from && this.to == ((Mapping) o).to) || (o instanceof Mapping && o == null && (this.from == null? (this.from.equals(((Mapping) o).from)) : (o.from == null)) && (this.to == null? (this.to.equals(((Mapping) o).to)) : (o.to == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Mapping[" + "from=" + from + "," + "to=" + to + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Mapping $allocate(); + + public void $init(String from, String to) { + super.$init(); + { + // compact constructor! + from = "abc"; + to = "def"; + } + //Created by RecordClassBuilder.java:131 + this.from = from; + //Created by RecordClassBuilder.java:131 + this.to = to; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.from = null; + //Created by PrepareObjectBuilder.java:94 + this.to = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.from = null; + //Created by PrepareObjectBuilder.java:94 + this.to = null; + } + + public Mapping $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } +} diff --git a/key.core/pipelineTests/records/expected/15_CreateBuilder/InnerRecord.java b/key.core/pipelineTests/records/expected/15_CreateBuilder/InnerRecord.java new file mode 100644 index 00000000000..486d8e8e159 --- /dev/null +++ b/key.core/pipelineTests/records/expected/15_CreateBuilder/InnerRecord.java @@ -0,0 +1,233 @@ +import java.lang.Object; + +public class OuterClass { + + @javax.annotation.processing.Generated("RecordClassBuilder") + final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String test() { + return test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof MyRecord && o == null && this.test == ((MyRecord) o).test) || (o instanceof MyRecord && o == null && (this.test == null? (this.test.equals(((MyRecord) o).test)) : (o.test == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + private OuterClass $enclosingThis; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyRecord $allocate(); + + public void $init(String test, OuterClass $ENCLOSING_THIS) { + super.$init(); + this.$enclosingThis = $ENCLOSING_THIS; + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.test = null; + //Created by PrepareObjectBuilder.java:94 + this.$enclosingThis = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.test = null; + //Created by PrepareObjectBuilder.java:94 + this.$enclosingThis = null; + } + + public MyRecord $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static OuterClass $allocate(); + + public OuterClass() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + } + + private void $prepareEnter() { + super.$prepare(); + } + + public OuterClass $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } +} diff --git a/key.core/pipelineTests/records/expected/15_CreateBuilder/NotAllowed.java b/key.core/pipelineTests/records/expected/15_CreateBuilder/NotAllowed.java new file mode 100644 index 00000000000..ae03a6dc1ef --- /dev/null +++ b/key.core/pipelineTests/records/expected/15_CreateBuilder/NotAllowed.java @@ -0,0 +1,347 @@ +//https://mikemybytes.com/2022/02/16/java-records-and-compact-constructors/ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class // package-private +Name extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Name && o == null && this.name == ((Name) o).name) || (o instanceof Name && o == null && (this.name == null? (this.name.equals(((Name) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Name[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + static Name of(String name) { + return new Name(name); + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static // package-private + Name $allocate(); + + private void $init(String name) { + super.$init(); + this.name = name; + } + + private void $init(String name) { + super.$init(); + this.name = name; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.name = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.name = null; + } + + public Name $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } +} + +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point && o == null && this.x == ((Point) o).x && this.y == ((Point) o).y) || (o instanceof Point && o == null && (x == ((Point) o).x) && (y == ((Point) o).y)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point[" + "x=" + x + "," + "y=" + y + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + Point(int x) { + // a bit weird... + // ... but perfectly fine for the compiler + this(x, 0); + } + + Point() { + // fails with: 'constructor is not canonical, so its first + // statement must invoke another constructor' + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Point $allocate(); + + void $init(int x, int y) { + super.$init(); + // boring! + this.x = x; + this.y = y; + } + + void $init(int x, int y) { + super.$init(); + // boring! + this.x = x; + this.y = y; + } + + void $init(int x) { + this.$init(x, 0); + } + + void $init() { + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.x = 0; + //Created by PrepareObjectBuilder.java:94 + this.y = 0; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.x = 0; + //Created by PrepareObjectBuilder.java:94 + this.y = 0; + } + + public Point $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } +} diff --git a/key.core/pipelineTests/records/expected/15_CreateBuilder/Point3d.java b/key.core/pipelineTests/records/expected/15_CreateBuilder/Point3d.java new file mode 100644 index 00000000000..80ae7db375e --- /dev/null +++ b/key.core/pipelineTests/records/expected/15_CreateBuilder/Point3d.java @@ -0,0 +1,169 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point3d extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int z; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int z() { + return z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y && z == this.z; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Point3d(int x, int y, int z) { + //Created by RecordClassBuilder.java:131 + this.x = x; + //Created by RecordClassBuilder.java:131 + this.y = y; + //Created by RecordClassBuilder.java:131 + this.z = z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point3d && o == null && this.x == ((Point3d) o).x && this.y == ((Point3d) o).y && this.z == ((Point3d) o).z) || (o instanceof Point3d && o == null && (x == ((Point3d) o).x) && (y == ((Point3d) o).y) && (z == ((Point3d) o).z)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point3d[" + "x=" + x + "," + "y=" + y + "," + "z=" + z + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Point3d $allocate(); + + public void $init(int x, int y, int z) { + super.$init(); + //Created by RecordClassBuilder.java:131 + this.x = x; + //Created by RecordClassBuilder.java:131 + this.y = y; + //Created by RecordClassBuilder.java:131 + this.z = z; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.x = 0; + //Created by PrepareObjectBuilder.java:94 + this.y = 0; + //Created by PrepareObjectBuilder.java:94 + this.z = 0; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.x = 0; + //Created by PrepareObjectBuilder.java:94 + this.y = 0; + //Created by PrepareObjectBuilder.java:94 + this.z = 0; + } + + public Point3d $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } +} diff --git a/key.core/pipelineTests/records/expected/15_CreateBuilder/RecordOverwriting.java b/key.core/pipelineTests/records/expected/15_CreateBuilder/RecordOverwriting.java new file mode 100644 index 00000000000..288403e2c81 --- /dev/null +++ b/key.core/pipelineTests/records/expected/15_CreateBuilder/RecordOverwriting.java @@ -0,0 +1,122 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + public int hashCode() { + return 0; + } + + public boolean equals(Object obj) { + return obj instanceof MyRecord; + } + + public String test() { + return ""; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyRecord $allocate(); + + public void $init(String test) { + super.$init(); + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.test = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.test = null; + } + + public MyRecord $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } +} diff --git a/key.core/pipelineTests/records/expected/15_CreateBuilder/SimpleRecord.java b/key.core/pipelineTests/records/expected/15_CreateBuilder/SimpleRecord.java new file mode 100644 index 00000000000..cc2c86f7c10 --- /dev/null +++ b/key.core/pipelineTests/records/expected/15_CreateBuilder/SimpleRecord.java @@ -0,0 +1,149 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +public final class SimpleRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final nullable String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final nullable String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof SimpleRecord && o == null && this.name == ((SimpleRecord) o).name) || (o instanceof SimpleRecord && o == null && (this.name == null? (this.name.equals(((SimpleRecord) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "SimpleRecord[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SimpleRecord $allocate(); + + void $init(String name) { + super.$init(); + this.name = name; + } + + void $init(String name) { + super.$init(); + this.name = name; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.name = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.name = null; + } + + public SimpleRecord $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } +} diff --git a/key.core/pipelineTests/records/expected/16_CreateObjectBuilder/CompactConstructor.java b/key.core/pipelineTests/records/expected/16_CreateObjectBuilder/CompactConstructor.java new file mode 100644 index 00000000000..8cb5d45d4a2 --- /dev/null +++ b/key.core/pipelineTests/records/expected/16_CreateObjectBuilder/CompactConstructor.java @@ -0,0 +1,171 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Mapping extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String from; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String from() { + return from; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String to; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String to() { + return to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures from == this.from && to == this.to; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Mapping(String from, String to) { + { + // compact constructor! + from = "abc"; + to = "def"; + } + //Created by RecordClassBuilder.java:131 + this.from = from; + //Created by RecordClassBuilder.java:131 + this.to = to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Mapping && o == null && this.from == ((Mapping) o).from && this.to == ((Mapping) o).to) || (o instanceof Mapping && o == null && (this.from == null? (this.from.equals(((Mapping) o).from)) : (o.from == null)) && (this.to == null? (this.to.equals(((Mapping) o).to)) : (o.to == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Mapping[" + "from=" + from + "," + "to=" + to + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Mapping $allocate(); + + public void $init(String from, String to) { + super.$init(); + { + // compact constructor! + from = "abc"; + to = "def"; + } + //Created by RecordClassBuilder.java:131 + this.from = from; + //Created by RecordClassBuilder.java:131 + this.to = to; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.from = null; + //Created by PrepareObjectBuilder.java:94 + this.to = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.from = null; + //Created by PrepareObjectBuilder.java:94 + this.to = null; + } + + public Mapping $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static Mapping $createObject() { + Mapping __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = Mapping.$allocate(); + __NEW__.$create()@Mapping + return __NEW__; + } +} diff --git a/key.core/pipelineTests/records/expected/16_CreateObjectBuilder/InnerRecord.java b/key.core/pipelineTests/records/expected/16_CreateObjectBuilder/InnerRecord.java new file mode 100644 index 00000000000..673914b4299 --- /dev/null +++ b/key.core/pipelineTests/records/expected/16_CreateObjectBuilder/InnerRecord.java @@ -0,0 +1,249 @@ +import java.lang.Object; + +public class OuterClass { + + @javax.annotation.processing.Generated("RecordClassBuilder") + final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String test() { + return test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof MyRecord && o == null && this.test == ((MyRecord) o).test) || (o instanceof MyRecord && o == null && (this.test == null? (this.test.equals(((MyRecord) o).test)) : (o.test == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + private OuterClass $enclosingThis; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyRecord $allocate(); + + public void $init(String test, OuterClass $ENCLOSING_THIS) { + super.$init(); + this.$enclosingThis = $ENCLOSING_THIS; + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.test = null; + //Created by PrepareObjectBuilder.java:94 + this.$enclosingThis = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.test = null; + //Created by PrepareObjectBuilder.java:94 + this.$enclosingThis = null; + } + + public MyRecord $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static MyRecord $createObject() { + MyRecord __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = MyRecord.$allocate(); + __NEW__.$create()@MyRecord + return __NEW__; + } + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static OuterClass $allocate(); + + public OuterClass() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + } + + private void $prepareEnter() { + super.$prepare(); + } + + public OuterClass $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static OuterClass $createObject() { + OuterClass __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = OuterClass.$allocate(); + __NEW__.$create()@OuterClass + return __NEW__; + } +} diff --git a/key.core/pipelineTests/records/expected/16_CreateObjectBuilder/NotAllowed.java b/key.core/pipelineTests/records/expected/16_CreateObjectBuilder/NotAllowed.java new file mode 100644 index 00000000000..25d4d0c36e5 --- /dev/null +++ b/key.core/pipelineTests/records/expected/16_CreateObjectBuilder/NotAllowed.java @@ -0,0 +1,367 @@ +//https://mikemybytes.com/2022/02/16/java-records-and-compact-constructors/ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class // package-private +Name extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Name && o == null && this.name == ((Name) o).name) || (o instanceof Name && o == null && (this.name == null? (this.name.equals(((Name) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Name[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + static Name of(String name) { + return new Name(name); + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static // package-private + Name $allocate(); + + private void $init(String name) { + super.$init(); + this.name = name; + } + + private void $init(String name) { + super.$init(); + this.name = name; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.name = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.name = null; + } + + public Name $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static // package-private + Name $createObject() { + // package-private + Name __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = // package-private + Name.$allocate(); + __NEW__.$create()@// package-private + Name + return __NEW__; + } +} + +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point && o == null && this.x == ((Point) o).x && this.y == ((Point) o).y) || (o instanceof Point && o == null && (x == ((Point) o).x) && (y == ((Point) o).y)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point[" + "x=" + x + "," + "y=" + y + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + Point(int x) { + // a bit weird... + // ... but perfectly fine for the compiler + this(x, 0); + } + + Point() { + // fails with: 'constructor is not canonical, so its first + // statement must invoke another constructor' + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Point $allocate(); + + void $init(int x, int y) { + super.$init(); + // boring! + this.x = x; + this.y = y; + } + + void $init(int x, int y) { + super.$init(); + // boring! + this.x = x; + this.y = y; + } + + void $init(int x) { + this.$init(x, 0); + } + + void $init() { + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.x = 0; + //Created by PrepareObjectBuilder.java:94 + this.y = 0; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.x = 0; + //Created by PrepareObjectBuilder.java:94 + this.y = 0; + } + + public Point $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static Point $createObject() { + Point __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = Point.$allocate(); + __NEW__.$create()@Point + return __NEW__; + } +} diff --git a/key.core/pipelineTests/records/expected/16_CreateObjectBuilder/Point3d.java b/key.core/pipelineTests/records/expected/16_CreateObjectBuilder/Point3d.java new file mode 100644 index 00000000000..8e0ecc2a3f9 --- /dev/null +++ b/key.core/pipelineTests/records/expected/16_CreateObjectBuilder/Point3d.java @@ -0,0 +1,177 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point3d extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int z; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int z() { + return z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y && z == this.z; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Point3d(int x, int y, int z) { + //Created by RecordClassBuilder.java:131 + this.x = x; + //Created by RecordClassBuilder.java:131 + this.y = y; + //Created by RecordClassBuilder.java:131 + this.z = z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point3d && o == null && this.x == ((Point3d) o).x && this.y == ((Point3d) o).y && this.z == ((Point3d) o).z) || (o instanceof Point3d && o == null && (x == ((Point3d) o).x) && (y == ((Point3d) o).y) && (z == ((Point3d) o).z)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point3d[" + "x=" + x + "," + "y=" + y + "," + "z=" + z + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Point3d $allocate(); + + public void $init(int x, int y, int z) { + super.$init(); + //Created by RecordClassBuilder.java:131 + this.x = x; + //Created by RecordClassBuilder.java:131 + this.y = y; + //Created by RecordClassBuilder.java:131 + this.z = z; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.x = 0; + //Created by PrepareObjectBuilder.java:94 + this.y = 0; + //Created by PrepareObjectBuilder.java:94 + this.z = 0; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.x = 0; + //Created by PrepareObjectBuilder.java:94 + this.y = 0; + //Created by PrepareObjectBuilder.java:94 + this.z = 0; + } + + public Point3d $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static Point3d $createObject() { + Point3d __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = Point3d.$allocate(); + __NEW__.$create()@Point3d + return __NEW__; + } +} diff --git a/key.core/pipelineTests/records/expected/16_CreateObjectBuilder/RecordOverwriting.java b/key.core/pipelineTests/records/expected/16_CreateObjectBuilder/RecordOverwriting.java new file mode 100644 index 00000000000..7bf6853be18 --- /dev/null +++ b/key.core/pipelineTests/records/expected/16_CreateObjectBuilder/RecordOverwriting.java @@ -0,0 +1,130 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + public int hashCode() { + return 0; + } + + public boolean equals(Object obj) { + return obj instanceof MyRecord; + } + + public String test() { + return ""; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyRecord $allocate(); + + public void $init(String test) { + super.$init(); + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.test = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.test = null; + } + + public MyRecord $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static MyRecord $createObject() { + MyRecord __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = MyRecord.$allocate(); + __NEW__.$create()@MyRecord + return __NEW__; + } +} diff --git a/key.core/pipelineTests/records/expected/16_CreateObjectBuilder/SimpleRecord.java b/key.core/pipelineTests/records/expected/16_CreateObjectBuilder/SimpleRecord.java new file mode 100644 index 00000000000..02f77c47f31 --- /dev/null +++ b/key.core/pipelineTests/records/expected/16_CreateObjectBuilder/SimpleRecord.java @@ -0,0 +1,157 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +public final class SimpleRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final nullable String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final nullable String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof SimpleRecord && o == null && this.name == ((SimpleRecord) o).name) || (o instanceof SimpleRecord && o == null && (this.name == null? (this.name.equals(((SimpleRecord) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "SimpleRecord[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SimpleRecord $allocate(); + + void $init(String name) { + super.$init(); + this.name = name; + } + + void $init(String name) { + super.$init(); + this.name = name; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.name = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.name = null; + } + + public SimpleRecord $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static SimpleRecord $createObject() { + SimpleRecord __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = SimpleRecord.$allocate(); + __NEW__.$create()@SimpleRecord + return __NEW__; + } +} diff --git a/key.core/pipelineTests/records/expected/17_LocalClassTransformation/CompactConstructor.java b/key.core/pipelineTests/records/expected/17_LocalClassTransformation/CompactConstructor.java new file mode 100644 index 00000000000..8cb5d45d4a2 --- /dev/null +++ b/key.core/pipelineTests/records/expected/17_LocalClassTransformation/CompactConstructor.java @@ -0,0 +1,171 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Mapping extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String from; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String from() { + return from; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String to; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String to() { + return to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures from == this.from && to == this.to; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Mapping(String from, String to) { + { + // compact constructor! + from = "abc"; + to = "def"; + } + //Created by RecordClassBuilder.java:131 + this.from = from; + //Created by RecordClassBuilder.java:131 + this.to = to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Mapping && o == null && this.from == ((Mapping) o).from && this.to == ((Mapping) o).to) || (o instanceof Mapping && o == null && (this.from == null? (this.from.equals(((Mapping) o).from)) : (o.from == null)) && (this.to == null? (this.to.equals(((Mapping) o).to)) : (o.to == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Mapping[" + "from=" + from + "," + "to=" + to + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Mapping $allocate(); + + public void $init(String from, String to) { + super.$init(); + { + // compact constructor! + from = "abc"; + to = "def"; + } + //Created by RecordClassBuilder.java:131 + this.from = from; + //Created by RecordClassBuilder.java:131 + this.to = to; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.from = null; + //Created by PrepareObjectBuilder.java:94 + this.to = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.from = null; + //Created by PrepareObjectBuilder.java:94 + this.to = null; + } + + public Mapping $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static Mapping $createObject() { + Mapping __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = Mapping.$allocate(); + __NEW__.$create()@Mapping + return __NEW__; + } +} diff --git a/key.core/pipelineTests/records/expected/17_LocalClassTransformation/InnerRecord.java b/key.core/pipelineTests/records/expected/17_LocalClassTransformation/InnerRecord.java new file mode 100644 index 00000000000..673914b4299 --- /dev/null +++ b/key.core/pipelineTests/records/expected/17_LocalClassTransformation/InnerRecord.java @@ -0,0 +1,249 @@ +import java.lang.Object; + +public class OuterClass { + + @javax.annotation.processing.Generated("RecordClassBuilder") + final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String test() { + return test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof MyRecord && o == null && this.test == ((MyRecord) o).test) || (o instanceof MyRecord && o == null && (this.test == null? (this.test.equals(((MyRecord) o).test)) : (o.test == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + private OuterClass $enclosingThis; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyRecord $allocate(); + + public void $init(String test, OuterClass $ENCLOSING_THIS) { + super.$init(); + this.$enclosingThis = $ENCLOSING_THIS; + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.test = null; + //Created by PrepareObjectBuilder.java:94 + this.$enclosingThis = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.test = null; + //Created by PrepareObjectBuilder.java:94 + this.$enclosingThis = null; + } + + public MyRecord $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static MyRecord $createObject() { + MyRecord __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = MyRecord.$allocate(); + __NEW__.$create()@MyRecord + return __NEW__; + } + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static OuterClass $allocate(); + + public OuterClass() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + } + + private void $prepareEnter() { + super.$prepare(); + } + + public OuterClass $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static OuterClass $createObject() { + OuterClass __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = OuterClass.$allocate(); + __NEW__.$create()@OuterClass + return __NEW__; + } +} diff --git a/key.core/pipelineTests/records/expected/17_LocalClassTransformation/NotAllowed.java b/key.core/pipelineTests/records/expected/17_LocalClassTransformation/NotAllowed.java new file mode 100644 index 00000000000..25d4d0c36e5 --- /dev/null +++ b/key.core/pipelineTests/records/expected/17_LocalClassTransformation/NotAllowed.java @@ -0,0 +1,367 @@ +//https://mikemybytes.com/2022/02/16/java-records-and-compact-constructors/ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class // package-private +Name extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Name && o == null && this.name == ((Name) o).name) || (o instanceof Name && o == null && (this.name == null? (this.name.equals(((Name) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Name[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + static Name of(String name) { + return new Name(name); + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static // package-private + Name $allocate(); + + private void $init(String name) { + super.$init(); + this.name = name; + } + + private void $init(String name) { + super.$init(); + this.name = name; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.name = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.name = null; + } + + public Name $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static // package-private + Name $createObject() { + // package-private + Name __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = // package-private + Name.$allocate(); + __NEW__.$create()@// package-private + Name + return __NEW__; + } +} + +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point && o == null && this.x == ((Point) o).x && this.y == ((Point) o).y) || (o instanceof Point && o == null && (x == ((Point) o).x) && (y == ((Point) o).y)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point[" + "x=" + x + "," + "y=" + y + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + Point(int x) { + // a bit weird... + // ... but perfectly fine for the compiler + this(x, 0); + } + + Point() { + // fails with: 'constructor is not canonical, so its first + // statement must invoke another constructor' + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Point $allocate(); + + void $init(int x, int y) { + super.$init(); + // boring! + this.x = x; + this.y = y; + } + + void $init(int x, int y) { + super.$init(); + // boring! + this.x = x; + this.y = y; + } + + void $init(int x) { + this.$init(x, 0); + } + + void $init() { + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.x = 0; + //Created by PrepareObjectBuilder.java:94 + this.y = 0; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.x = 0; + //Created by PrepareObjectBuilder.java:94 + this.y = 0; + } + + public Point $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static Point $createObject() { + Point __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = Point.$allocate(); + __NEW__.$create()@Point + return __NEW__; + } +} diff --git a/key.core/pipelineTests/records/expected/17_LocalClassTransformation/Point3d.java b/key.core/pipelineTests/records/expected/17_LocalClassTransformation/Point3d.java new file mode 100644 index 00000000000..8e0ecc2a3f9 --- /dev/null +++ b/key.core/pipelineTests/records/expected/17_LocalClassTransformation/Point3d.java @@ -0,0 +1,177 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point3d extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int z; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int z() { + return z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y && z == this.z; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Point3d(int x, int y, int z) { + //Created by RecordClassBuilder.java:131 + this.x = x; + //Created by RecordClassBuilder.java:131 + this.y = y; + //Created by RecordClassBuilder.java:131 + this.z = z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point3d && o == null && this.x == ((Point3d) o).x && this.y == ((Point3d) o).y && this.z == ((Point3d) o).z) || (o instanceof Point3d && o == null && (x == ((Point3d) o).x) && (y == ((Point3d) o).y) && (z == ((Point3d) o).z)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point3d[" + "x=" + x + "," + "y=" + y + "," + "z=" + z + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Point3d $allocate(); + + public void $init(int x, int y, int z) { + super.$init(); + //Created by RecordClassBuilder.java:131 + this.x = x; + //Created by RecordClassBuilder.java:131 + this.y = y; + //Created by RecordClassBuilder.java:131 + this.z = z; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.x = 0; + //Created by PrepareObjectBuilder.java:94 + this.y = 0; + //Created by PrepareObjectBuilder.java:94 + this.z = 0; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.x = 0; + //Created by PrepareObjectBuilder.java:94 + this.y = 0; + //Created by PrepareObjectBuilder.java:94 + this.z = 0; + } + + public Point3d $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static Point3d $createObject() { + Point3d __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = Point3d.$allocate(); + __NEW__.$create()@Point3d + return __NEW__; + } +} diff --git a/key.core/pipelineTests/records/expected/17_LocalClassTransformation/RecordOverwriting.java b/key.core/pipelineTests/records/expected/17_LocalClassTransformation/RecordOverwriting.java new file mode 100644 index 00000000000..7bf6853be18 --- /dev/null +++ b/key.core/pipelineTests/records/expected/17_LocalClassTransformation/RecordOverwriting.java @@ -0,0 +1,130 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + public int hashCode() { + return 0; + } + + public boolean equals(Object obj) { + return obj instanceof MyRecord; + } + + public String test() { + return ""; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyRecord $allocate(); + + public void $init(String test) { + super.$init(); + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.test = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.test = null; + } + + public MyRecord $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static MyRecord $createObject() { + MyRecord __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = MyRecord.$allocate(); + __NEW__.$create()@MyRecord + return __NEW__; + } +} diff --git a/key.core/pipelineTests/records/expected/17_LocalClassTransformation/SimpleRecord.java b/key.core/pipelineTests/records/expected/17_LocalClassTransformation/SimpleRecord.java new file mode 100644 index 00000000000..02f77c47f31 --- /dev/null +++ b/key.core/pipelineTests/records/expected/17_LocalClassTransformation/SimpleRecord.java @@ -0,0 +1,157 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +public final class SimpleRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final nullable String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final nullable String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof SimpleRecord && o == null && this.name == ((SimpleRecord) o).name) || (o instanceof SimpleRecord && o == null && (this.name == null? (this.name.equals(((SimpleRecord) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "SimpleRecord[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SimpleRecord $allocate(); + + void $init(String name) { + super.$init(); + this.name = name; + } + + void $init(String name) { + super.$init(); + this.name = name; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.name = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.name = null; + } + + public SimpleRecord $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static SimpleRecord $createObject() { + SimpleRecord __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = SimpleRecord.$allocate(); + __NEW__.$create()@SimpleRecord + return __NEW__; + } +} diff --git a/key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/CompactConstructor.java b/key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/CompactConstructor.java new file mode 100644 index 00000000000..8cb5d45d4a2 --- /dev/null +++ b/key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/CompactConstructor.java @@ -0,0 +1,171 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Mapping extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String from; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String from() { + return from; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String to; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String to() { + return to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures from == this.from && to == this.to; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Mapping(String from, String to) { + { + // compact constructor! + from = "abc"; + to = "def"; + } + //Created by RecordClassBuilder.java:131 + this.from = from; + //Created by RecordClassBuilder.java:131 + this.to = to; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Mapping && o == null && this.from == ((Mapping) o).from && this.to == ((Mapping) o).to) || (o instanceof Mapping && o == null && (this.from == null? (this.from.equals(((Mapping) o).from)) : (o.from == null)) && (this.to == null? (this.to.equals(((Mapping) o).to)) : (o.to == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Mapping[" + "from=" + from + "," + "to=" + to + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Mapping $allocate(); + + public void $init(String from, String to) { + super.$init(); + { + // compact constructor! + from = "abc"; + to = "def"; + } + //Created by RecordClassBuilder.java:131 + this.from = from; + //Created by RecordClassBuilder.java:131 + this.to = to; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.from = null; + //Created by PrepareObjectBuilder.java:94 + this.to = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.from = null; + //Created by PrepareObjectBuilder.java:94 + this.to = null; + } + + public Mapping $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static Mapping $createObject() { + Mapping __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = Mapping.$allocate(); + __NEW__.$create()@Mapping + return __NEW__; + } +} diff --git a/key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/InnerRecord.java b/key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/InnerRecord.java new file mode 100644 index 00000000000..673914b4299 --- /dev/null +++ b/key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/InnerRecord.java @@ -0,0 +1,249 @@ +import java.lang.Object; + +public class OuterClass { + + @javax.annotation.processing.Generated("RecordClassBuilder") + final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String test() { + return test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof MyRecord && o == null && this.test == ((MyRecord) o).test) || (o instanceof MyRecord && o == null && (this.test == null? (this.test.equals(((MyRecord) o).test)) : (o.test == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + private OuterClass $enclosingThis; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyRecord $allocate(); + + public void $init(String test, OuterClass $ENCLOSING_THIS) { + super.$init(); + this.$enclosingThis = $ENCLOSING_THIS; + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.test = null; + //Created by PrepareObjectBuilder.java:94 + this.$enclosingThis = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.test = null; + //Created by PrepareObjectBuilder.java:94 + this.$enclosingThis = null; + } + + public MyRecord $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static MyRecord $createObject() { + MyRecord __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = MyRecord.$allocate(); + __NEW__.$create()@MyRecord + return __NEW__; + } + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static OuterClass $allocate(); + + public OuterClass() { + } + + public void $init() { + super.$init(); + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + } + + private void $prepareEnter() { + super.$prepare(); + } + + public OuterClass $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static OuterClass $createObject() { + OuterClass __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = OuterClass.$allocate(); + __NEW__.$create()@OuterClass + return __NEW__; + } +} diff --git a/key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/NotAllowed.java b/key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/NotAllowed.java new file mode 100644 index 00000000000..25d4d0c36e5 --- /dev/null +++ b/key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/NotAllowed.java @@ -0,0 +1,367 @@ +//https://mikemybytes.com/2022/02/16/java-records-and-compact-constructors/ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class // package-private +Name extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Name && o == null && this.name == ((Name) o).name) || (o instanceof Name && o == null && (this.name == null? (this.name.equals(((Name) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Name[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + // was package)' + private Name(String name) { + this.name = name; + } + + static Name of(String name) { + return new Name(name); + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static // package-private + Name $allocate(); + + private void $init(String name) { + super.$init(); + this.name = name; + } + + private void $init(String name) { + super.$init(); + this.name = name; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.name = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.name = null; + } + + public Name $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static // package-private + Name $createObject() { + // package-private + Name __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = // package-private + Name.$allocate(); + __NEW__.$create()@// package-private + Name + return __NEW__; + } +} + +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point && o == null && this.x == ((Point) o).x && this.y == ((Point) o).y) || (o instanceof Point && o == null && (x == ((Point) o).x) && (y == ((Point) o).y)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point[" + "x=" + x + "," + "y=" + y + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y; + @ assignable this.*; + + @*/ + Point(int x, int y) { + // boring! + this.x = x; + this.y = y; + } + + Point(int x) { + // a bit weird... + // ... but perfectly fine for the compiler + this(x, 0); + } + + Point() { + // fails with: 'constructor is not canonical, so its first + // statement must invoke another constructor' + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Point $allocate(); + + void $init(int x, int y) { + super.$init(); + // boring! + this.x = x; + this.y = y; + } + + void $init(int x, int y) { + super.$init(); + // boring! + this.x = x; + this.y = y; + } + + void $init(int x) { + this.$init(x, 0); + } + + void $init() { + super.$init(); + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.x = 0; + //Created by PrepareObjectBuilder.java:94 + this.y = 0; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.x = 0; + //Created by PrepareObjectBuilder.java:94 + this.y = 0; + } + + public Point $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static Point $createObject() { + Point __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = Point.$allocate(); + __NEW__.$create()@Point + return __NEW__; + } +} diff --git a/key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/Point3d.java b/key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/Point3d.java new file mode 100644 index 00000000000..8e0ecc2a3f9 --- /dev/null +++ b/key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/Point3d.java @@ -0,0 +1,177 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class Point3d extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int x; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int x() { + return x; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int y; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int y() { + return y; + } + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final int z; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int z() { + return z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures x == this.x && y == this.y && z == this.z; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public Point3d(int x, int y, int z) { + //Created by RecordClassBuilder.java:131 + this.x = x; + //Created by RecordClassBuilder.java:131 + this.y = y; + //Created by RecordClassBuilder.java:131 + this.z = z; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof Point3d && o == null && this.x == ((Point3d) o).x && this.y == ((Point3d) o).y && this.z == ((Point3d) o).z) || (o instanceof Point3d && o == null && (x == ((Point3d) o).x) && (y == ((Point3d) o).y) && (z == ((Point3d) o).z)))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "Point3d[" + "x=" + x + "," + "y=" + y + "," + "z=" + z + "]"; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Point3d $allocate(); + + public void $init(int x, int y, int z) { + super.$init(); + //Created by RecordClassBuilder.java:131 + this.x = x; + //Created by RecordClassBuilder.java:131 + this.y = y; + //Created by RecordClassBuilder.java:131 + this.z = z; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.x = 0; + //Created by PrepareObjectBuilder.java:94 + this.y = 0; + //Created by PrepareObjectBuilder.java:94 + this.z = 0; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.x = 0; + //Created by PrepareObjectBuilder.java:94 + this.y = 0; + //Created by PrepareObjectBuilder.java:94 + this.z = 0; + } + + public Point3d $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static Point3d $createObject() { + Point3d __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = Point3d.$allocate(); + __NEW__.$create()@Point3d + return __NEW__; + } +} diff --git a/key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/RecordOverwriting.java b/key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/RecordOverwriting.java new file mode 100644 index 00000000000..7bf6853be18 --- /dev/null +++ b/key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/RecordOverwriting.java @@ -0,0 +1,130 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +final class MyRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final String test; + + /*@ public normal_behavior + @ requires true; + @ ensures test == this.test; + @ assignable this.*; + + @*/ + @javax.annotation.processing.Generated("RecordClassBuilder") + public MyRecord(String test) { + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "MyRecord[" + "test=" + test + "]"; + } + + public int hashCode() { + return 0; + } + + public boolean equals(Object obj) { + return obj instanceof MyRecord; + } + + public String test() { + return ""; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static MyRecord $allocate(); + + public void $init(String test) { + super.$init(); + //Created by RecordClassBuilder.java:131 + this.test = test; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.test = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.test = null; + } + + public MyRecord $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static MyRecord $createObject() { + MyRecord __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = MyRecord.$allocate(); + __NEW__.$create()@MyRecord + return __NEW__; + } +} diff --git a/key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/SimpleRecord.java b/key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/SimpleRecord.java new file mode 100644 index 00000000000..02f77c47f31 --- /dev/null +++ b/key.core/pipelineTests/records/expected/18_ConstantStringExpressionEvaluator/SimpleRecord.java @@ -0,0 +1,157 @@ +@javax.annotation.processing.Generated("RecordClassBuilder") +public final class SimpleRecord extends Record { + + @javax.annotation.processing.Generated("RecordClassBuilder") + private final nullable String name; + + @javax.annotation.processing.Generated("RecordClassBuilder") + public final nullable String name() { + return name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + /*@ public normal_behavior + @ requires true; + @ ensures ((this == o) || (o instanceof SimpleRecord && o == null && this.name == ((SimpleRecord) o).name) || (o instanceof SimpleRecord && o == null && (this.name == null? (this.name.equals(((SimpleRecord) o).name)) : (o.name == null))))<==>\result; + @ ensures hashCode() == o.hashCode() ==> !\result; + @ ensures o == null ==> !\result; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final boolean equals(java.lang.Object o); + + /*@ public normal_behavior + @ ensures true; + @ requires true; + @ assignable \strictly_nothing; + + @*/ + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final int hashCode(); + + @Override() + @javax.annotation.processing.Generated("RecordClassBuilder") + public final non_null String toString() { + return "SimpleRecord[" + "name=" + name + "]"; + } + + /*@ public normal_behavior + @ requires true; + @ ensures name == this.name; + @ assignable this.*; + + @*/ + SimpleRecord(String name) { + this.name = name; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SimpleRecord $allocate(); + + void $init(String name) { + super.$init(); + this.name = name; + } + + void $init(String name) { + super.$init(); + this.name = name; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Record.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.name = null; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.name = null; + } + + public SimpleRecord $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static SimpleRecord $createObject() { + SimpleRecord __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = SimpleRecord.$allocate(); + __NEW__.$create()@SimpleRecord + return __NEW__; + } +} diff --git a/key.core/pipelineTests/simple/expected/04_EnumClassAccessExplicit/Test.java b/key.core/pipelineTests/simple/expected/04_EnumClassAccessExplicit/Test.java new file mode 100644 index 00000000000..dba29c488a0 --- /dev/null +++ b/key.core/pipelineTests/simple/expected/04_EnumClassAccessExplicit/Test.java @@ -0,0 +1,24 @@ +public class Test { + + public static int abc; + + static { + // should be resolved to 2 + abc = 1 + 1; + } + + public int memberVar; + + { + memberVar = 42; + } +} + +public class SubClass extends Test { + + public int memberVar; + + { + memberVar = 41; + } +} diff --git a/key.core/pipelineTests/simple/expected/05_EnumClassBuilder/Test.java b/key.core/pipelineTests/simple/expected/05_EnumClassBuilder/Test.java new file mode 100644 index 00000000000..dba29c488a0 --- /dev/null +++ b/key.core/pipelineTests/simple/expected/05_EnumClassBuilder/Test.java @@ -0,0 +1,24 @@ +public class Test { + + public static int abc; + + static { + // should be resolved to 2 + abc = 1 + 1; + } + + public int memberVar; + + { + memberVar = 42; + } +} + +public class SubClass extends Test { + + public int memberVar; + + { + memberVar = 41; + } +} diff --git a/key.core/pipelineTests/simple/expected/06_RecordClassBuilder/Test.java b/key.core/pipelineTests/simple/expected/06_RecordClassBuilder/Test.java new file mode 100644 index 00000000000..dba29c488a0 --- /dev/null +++ b/key.core/pipelineTests/simple/expected/06_RecordClassBuilder/Test.java @@ -0,0 +1,24 @@ +public class Test { + + public static int abc; + + static { + // should be resolved to 2 + abc = 1 + 1; + } + + public int memberVar; + + { + memberVar = 42; + } +} + +public class SubClass extends Test { + + public int memberVar; + + { + memberVar = 41; + } +} diff --git a/key.core/pipelineTests/simple/expected/07_JMLTransformer/Test.java b/key.core/pipelineTests/simple/expected/07_JMLTransformer/Test.java new file mode 100644 index 00000000000..dba29c488a0 --- /dev/null +++ b/key.core/pipelineTests/simple/expected/07_JMLTransformer/Test.java @@ -0,0 +1,24 @@ +public class Test { + + public static int abc; + + static { + // should be resolved to 2 + abc = 1 + 1; + } + + public int memberVar; + + { + memberVar = 42; + } +} + +public class SubClass extends Test { + + public int memberVar; + + { + memberVar = 41; + } +} diff --git a/key.core/pipelineTests/simple/expected/08_JmlDocRemoval/Test.java b/key.core/pipelineTests/simple/expected/08_JmlDocRemoval/Test.java new file mode 100644 index 00000000000..dba29c488a0 --- /dev/null +++ b/key.core/pipelineTests/simple/expected/08_JmlDocRemoval/Test.java @@ -0,0 +1,24 @@ +public class Test { + + public static int abc; + + static { + // should be resolved to 2 + abc = 1 + 1; + } + + public int memberVar; + + { + memberVar = 42; + } +} + +public class SubClass extends Test { + + public int memberVar; + + { + memberVar = 41; + } +} diff --git a/key.core/pipelineTests/simple/expected/09_ImplicitFieldAdder/Test.java b/key.core/pipelineTests/simple/expected/09_ImplicitFieldAdder/Test.java new file mode 100644 index 00000000000..e3c9d609b0d --- /dev/null +++ b/key.core/pipelineTests/simple/expected/09_ImplicitFieldAdder/Test.java @@ -0,0 +1,60 @@ +public class Test { + + public static int abc; + + static { + // should be resolved to 2 + abc = 1 + 1; + } + + public int memberVar; + + { + memberVar = 42; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; +} + +public class SubClass extends Test { + + public int memberVar; + + { + memberVar = 41; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; +} diff --git a/key.core/pipelineTests/simple/expected/10_InstanceAllocationMethodBuilder/Test.java b/key.core/pipelineTests/simple/expected/10_InstanceAllocationMethodBuilder/Test.java new file mode 100644 index 00000000000..939c13da9ba --- /dev/null +++ b/key.core/pipelineTests/simple/expected/10_InstanceAllocationMethodBuilder/Test.java @@ -0,0 +1,64 @@ +public class Test { + + public static int abc; + + static { + // should be resolved to 2 + abc = 1 + 1; + } + + public int memberVar; + + { + memberVar = 42; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Test $allocate(); +} + +public class SubClass extends Test { + + public int memberVar; + + { + memberVar = 41; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SubClass $allocate(); +} diff --git a/key.core/pipelineTests/simple/expected/11_ConstructorNormalformBuilder/Test.java b/key.core/pipelineTests/simple/expected/11_ConstructorNormalformBuilder/Test.java new file mode 100644 index 00000000000..0fcacd6fef9 --- /dev/null +++ b/key.core/pipelineTests/simple/expected/11_ConstructorNormalformBuilder/Test.java @@ -0,0 +1,100 @@ +public class Test { + + public static int abc; + + static { + // should be resolved to 2 + abc = 1 + 1; + } + + public int memberVar; + + { + memberVar = 42; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Test $allocate(); + + public Test() { + } + + private void $objectInitializer0() { + memberVar = 42; + } + + public void $init() { + super.$init(); + $objectInitializer0(); + super.$init(); + $objectInitializer0(); + } + + private void $objectInitializer0() { + memberVar = 42; + } +} + +public class SubClass extends Test { + + public int memberVar; + + { + memberVar = 41; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SubClass $allocate(); + + public SubClass() { + } + + private void $objectInitializer0() { + memberVar = 41; + } + + public void $init() { + super.$init(); + $objectInitializer0(); + super.$init(); + $objectInitializer0(); + } + + private void $objectInitializer0() { + memberVar = 41; + } +} diff --git a/key.core/pipelineTests/simple/expected/12_ClassPreparationMethodBuilder/Test.java b/key.core/pipelineTests/simple/expected/12_ClassPreparationMethodBuilder/Test.java new file mode 100644 index 00000000000..825b89f91cf --- /dev/null +++ b/key.core/pipelineTests/simple/expected/12_ClassPreparationMethodBuilder/Test.java @@ -0,0 +1,106 @@ +public class Test { + + public static int abc; + + static { + // should be resolved to 2 + abc = 1 + 1; + } + + public int memberVar; + + { + memberVar = 42; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Test $allocate(); + + public Test() { + } + + private void $objectInitializer0() { + memberVar = 42; + } + + public void $init() { + super.$init(); + $objectInitializer0(); + super.$init(); + $objectInitializer0(); + } + + private void $objectInitializer0() { + memberVar = 42; + } + + static private void $clprepare() { + } +} + +public class SubClass extends Test { + + public int memberVar; + + { + memberVar = 41; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SubClass $allocate(); + + public SubClass() { + } + + private void $objectInitializer0() { + memberVar = 41; + } + + public void $init() { + super.$init(); + $objectInitializer0(); + super.$init(); + $objectInitializer0(); + } + + private void $objectInitializer0() { + memberVar = 41; + } + + static private void $clprepare() { + } +} diff --git a/key.core/pipelineTests/simple/expected/13_ClassInitializeMethodBuilder/Test.java b/key.core/pipelineTests/simple/expected/13_ClassInitializeMethodBuilder/Test.java new file mode 100644 index 00000000000..5d8570e373a --- /dev/null +++ b/key.core/pipelineTests/simple/expected/13_ClassInitializeMethodBuilder/Test.java @@ -0,0 +1,186 @@ +public class Test { + + public static int abc; + + static { + // should be resolved to 2 + abc = 1 + 1; + } + + public int memberVar; + + { + memberVar = 42; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Test $allocate(); + + public Test() { + } + + private void $objectInitializer0() { + memberVar = 42; + } + + public void $init() { + super.$init(); + $objectInitializer0(); + super.$init(); + $objectInitializer0(); + } + + private void $objectInitializer0() { + memberVar = 42; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + { + // should be resolved to 2 + abc = 1 + 1; + } + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } +} + +public class SubClass extends Test { + + public int memberVar; + + { + memberVar = 41; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SubClass $allocate(); + + public SubClass() { + } + + private void $objectInitializer0() { + memberVar = 41; + } + + public void $init() { + super.$init(); + $objectInitializer0(); + super.$init(); + $objectInitializer0(); + } + + private void $objectInitializer0() { + memberVar = 41; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(Test.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } +} diff --git a/key.core/pipelineTests/simple/expected/14_PrepareObjectBuilder/Test.java b/key.core/pipelineTests/simple/expected/14_PrepareObjectBuilder/Test.java new file mode 100644 index 00000000000..53a5436e9ab --- /dev/null +++ b/key.core/pipelineTests/simple/expected/14_PrepareObjectBuilder/Test.java @@ -0,0 +1,210 @@ +public class Test { + + public static int abc; + + static { + // should be resolved to 2 + abc = 1 + 1; + } + + public int memberVar; + + { + memberVar = 42; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Test $allocate(); + + public Test() { + } + + private void $objectInitializer0() { + memberVar = 42; + } + + public void $init() { + super.$init(); + $objectInitializer0(); + super.$init(); + $objectInitializer0(); + } + + private void $objectInitializer0() { + memberVar = 42; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + { + // should be resolved to 2 + abc = 1 + 1; + } + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.memberVar = 0; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.memberVar = 0; + } +} + +public class SubClass extends Test { + + public int memberVar; + + { + memberVar = 41; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SubClass $allocate(); + + public SubClass() { + } + + private void $objectInitializer0() { + memberVar = 41; + } + + public void $init() { + super.$init(); + $objectInitializer0(); + super.$init(); + $objectInitializer0(); + } + + private void $objectInitializer0() { + memberVar = 41; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(Test.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.memberVar = 0; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.memberVar = 0; + } +} diff --git a/key.core/pipelineTests/simple/expected/15_CreateBuilder/Test.java b/key.core/pipelineTests/simple/expected/15_CreateBuilder/Test.java new file mode 100644 index 00000000000..0116b540187 --- /dev/null +++ b/key.core/pipelineTests/simple/expected/15_CreateBuilder/Test.java @@ -0,0 +1,224 @@ +public class Test { + + public static int abc; + + static { + // should be resolved to 2 + abc = 1 + 1; + } + + public int memberVar; + + { + memberVar = 42; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Test $allocate(); + + public Test() { + } + + private void $objectInitializer0() { + memberVar = 42; + } + + public void $init() { + super.$init(); + $objectInitializer0(); + super.$init(); + $objectInitializer0(); + } + + private void $objectInitializer0() { + memberVar = 42; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + { + // should be resolved to 2 + abc = 1 + 1; + } + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.memberVar = 0; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.memberVar = 0; + } + + public Test $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } +} + +public class SubClass extends Test { + + public int memberVar; + + { + memberVar = 41; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SubClass $allocate(); + + public SubClass() { + } + + private void $objectInitializer0() { + memberVar = 41; + } + + public void $init() { + super.$init(); + $objectInitializer0(); + super.$init(); + $objectInitializer0(); + } + + private void $objectInitializer0() { + memberVar = 41; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(Test.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.memberVar = 0; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.memberVar = 0; + } + + public SubClass $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } +} diff --git a/key.core/pipelineTests/simple/expected/16_CreateObjectBuilder/Test.java b/key.core/pipelineTests/simple/expected/16_CreateObjectBuilder/Test.java new file mode 100644 index 00000000000..44f496647fc --- /dev/null +++ b/key.core/pipelineTests/simple/expected/16_CreateObjectBuilder/Test.java @@ -0,0 +1,240 @@ +public class Test { + + public static int abc; + + static { + // should be resolved to 2 + abc = 1 + 1; + } + + public int memberVar; + + { + memberVar = 42; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Test $allocate(); + + public Test() { + } + + private void $objectInitializer0() { + memberVar = 42; + } + + public void $init() { + super.$init(); + $objectInitializer0(); + super.$init(); + $objectInitializer0(); + } + + private void $objectInitializer0() { + memberVar = 42; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + { + // should be resolved to 2 + abc = 1 + 1; + } + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.memberVar = 0; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.memberVar = 0; + } + + public Test $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static Test $createObject() { + Test __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = Test.$allocate(); + __NEW__.$create()@Test + return __NEW__; + } +} + +public class SubClass extends Test { + + public int memberVar; + + { + memberVar = 41; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SubClass $allocate(); + + public SubClass() { + } + + private void $objectInitializer0() { + memberVar = 41; + } + + public void $init() { + super.$init(); + $objectInitializer0(); + super.$init(); + $objectInitializer0(); + } + + private void $objectInitializer0() { + memberVar = 41; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(Test.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.memberVar = 0; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.memberVar = 0; + } + + public SubClass $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static SubClass $createObject() { + SubClass __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = SubClass.$allocate(); + __NEW__.$create()@SubClass + return __NEW__; + } +} diff --git a/key.core/pipelineTests/simple/expected/17_LocalClassTransformation/Test.java b/key.core/pipelineTests/simple/expected/17_LocalClassTransformation/Test.java new file mode 100644 index 00000000000..44f496647fc --- /dev/null +++ b/key.core/pipelineTests/simple/expected/17_LocalClassTransformation/Test.java @@ -0,0 +1,240 @@ +public class Test { + + public static int abc; + + static { + // should be resolved to 2 + abc = 1 + 1; + } + + public int memberVar; + + { + memberVar = 42; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Test $allocate(); + + public Test() { + } + + private void $objectInitializer0() { + memberVar = 42; + } + + public void $init() { + super.$init(); + $objectInitializer0(); + super.$init(); + $objectInitializer0(); + } + + private void $objectInitializer0() { + memberVar = 42; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + { + // should be resolved to 2 + abc = 1 + 1; + } + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.memberVar = 0; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.memberVar = 0; + } + + public Test $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static Test $createObject() { + Test __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = Test.$allocate(); + __NEW__.$create()@Test + return __NEW__; + } +} + +public class SubClass extends Test { + + public int memberVar; + + { + memberVar = 41; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SubClass $allocate(); + + public SubClass() { + } + + private void $objectInitializer0() { + memberVar = 41; + } + + public void $init() { + super.$init(); + $objectInitializer0(); + super.$init(); + $objectInitializer0(); + } + + private void $objectInitializer0() { + memberVar = 41; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(Test.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.memberVar = 0; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.memberVar = 0; + } + + public SubClass $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static SubClass $createObject() { + SubClass __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = SubClass.$allocate(); + __NEW__.$create()@SubClass + return __NEW__; + } +} diff --git a/key.core/pipelineTests/simple/expected/18_ConstantStringExpressionEvaluator/Test.java b/key.core/pipelineTests/simple/expected/18_ConstantStringExpressionEvaluator/Test.java new file mode 100644 index 00000000000..44f496647fc --- /dev/null +++ b/key.core/pipelineTests/simple/expected/18_ConstantStringExpressionEvaluator/Test.java @@ -0,0 +1,240 @@ +public class Test { + + public static int abc; + + static { + // should be resolved to 2 + abc = 1 + 1; + } + + public int memberVar; + + { + memberVar = 42; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static Test $allocate(); + + public Test() { + } + + private void $objectInitializer0() { + memberVar = 42; + } + + public void $init() { + super.$init(); + $objectInitializer0(); + super.$init(); + $objectInitializer0(); + } + + private void $objectInitializer0() { + memberVar = 42; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(java.lang.Object.$clinit()); + { + // should be resolved to 2 + abc = 1 + 1; + } + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.memberVar = 0; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.memberVar = 0; + } + + public Test $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static Test $createObject() { + Test __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = Test.$allocate(); + __NEW__.$create()@Test + return __NEW__; + } +} + +public class SubClass extends Test { + + public int memberVar; + + { + memberVar = 41; + } + + @javax.annotation.processing.Generated() + static private boolean $classInitializationInProgress; + + @javax.annotation.processing.Generated() + static private boolean $classErroneous; + + @javax.annotation.processing.Generated() + static private boolean $classInitialized; + + @javax.annotation.processing.Generated() + static private boolean $classPrepared; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv; + + @javax.annotation.processing.Generated() + static public model boolean $staticInv_free; + + public static SubClass $allocate(); + + public SubClass() { + } + + private void $objectInitializer0() { + memberVar = 41; + } + + public void $init() { + super.$init(); + $objectInitializer0(); + super.$init(); + $objectInitializer0(); + } + + private void $objectInitializer0() { + memberVar = 41; + } + + static private void $clprepare() { + } + + static public void $clinit() { + if (!@($classInitialized)) { + if (!@($classInitializationInProgress)) { + if (!@($classPrepared)) { + //Created by ClassInitializeMethodBuilder.java:219 + @($clprepare()); + } + if (@($classErroneous)) { + throw new java.lang.NoClassDefFoundError(); + } + //Created by ClassInitializeMethodBuilder.java:243 + @($classInitializationInProgress) = true; + try { + @(Test.$clinit()); + }//Created by ClassInitializeMethodBuilder.java:194 + catch (java.lang.Error err) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw err; + } catch (java.lang.Throwable twa) { + //Created by ClassInitializeMethodBuilder.java:154 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:155 + @($classErroneous) = true; + throw new java.lang.ExceptionInInitializerError(twa); + } + //Created by ClassInitializeMethodBuilder.java:249 + @($classInitializationInProgress) = false; + //Created by ClassInitializeMethodBuilder.java:251 + @($classErroneous) = false; + //Created by ClassInitializeMethodBuilder.java:253 + @($classInitialized) = true; + } + } + } + + protected void $prepare() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.memberVar = 0; + } + + private void $prepareEnter() { + super.$prepare(); + //Created by PrepareObjectBuilder.java:94 + this.memberVar = 0; + } + + public SubClass $create() { + //Created by CreateBuilder.java:57 + this.$initialized = false; + $prepareEnter(); + return this; + } + + public static SubClass $createObject() { + SubClass __NEW__; + //Created by CreateObjectBuilder.java:70 + __NEW__ = SubClass.$allocate(); + __NEW__.$create()@SubClass + return __NEW__; + } +}