From db70e3d2f40df53b7e4658ebfc9c58dd86a48dd8 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Fri, 8 Jul 2022 20:12:42 +0200 Subject: [PATCH 01/66] grammar and taclet generation --- key.core/src/main/antlr4/KeYLexer.g4 | 3 + key.core/src/main/antlr4/KeYParser.g4 | 31 +++++ .../nparser/builder/DeclarationBuilder.java | 17 ++- .../builder/FunctionPredicateBuilder.java | 19 +++- .../key/nparser/builder/TacletPBuilder.java | 107 +++++++++++++++++- key/test/enum.key | 7 ++ 6 files changed, 177 insertions(+), 7 deletions(-) create mode 100644 key/test/enum.key diff --git a/key.core/src/main/antlr4/KeYLexer.g4 b/key.core/src/main/antlr4/KeYLexer.g4 index c41a0a39b0..dcb7e8b33d 100644 --- a/key.core/src/main/antlr4/KeYLexer.g4 +++ b/key.core/src/main/antlr4/KeYLexer.g4 @@ -185,6 +185,7 @@ PROFILE : '\\profile'; TRUE : 'true'; FALSE : 'false'; + // Keywords related to taclets SAMEUPDATELEVEL : '\\sameUpdateLevel'; INSEQUENTSTATE : '\\inSequentState'; @@ -207,8 +208,10 @@ AVOID : '\\avoid'; PREDICATES : '\\predicates'; FUNCTIONS : '\\functions'; +DATATYPES : '\\datatypes'; TRANSFORMERS : '\\transformers'; UNIQUE : '\\unique'; +FREE : '\\free'; RULES : '\\rules'; AXIOMS : '\\axioms'; diff --git a/key.core/src/main/antlr4/KeYParser.g4 b/key.core/src/main/antlr4/KeYParser.g4 index 6eb5b9629a..d8cb89697d 100644 --- a/key.core/src/main/antlr4/KeYParser.g4 +++ b/key.core/src/main/antlr4/KeYParser.g4 @@ -27,6 +27,7 @@ decls | pred_decls | func_decls | transform_decls + | datatype_decls | ruleset_decls | contracts // for problems | invariants // for problems @@ -229,6 +230,35 @@ func_decl SEMI ; +/** +\datatypes { + \free List = Nil | Cons(any head, List tail); +} +*/ +datatype_decls: + DATATYPES LBRACE datatype_decl* RBRACE +; + +datatype_decl: + doc=DOC_COMMENT? + FREE? + name=simple_ident + EQUALS + datatype_constructor (OR datatype_constructor)* + SEMI +; + +datatype_constructor: + name=simple_ident + ( + LPAREN + (argSort+=sortId argName+=simple_ident + (COMMA argSort+=sortId argName+=simple_ident)* + )? + RPAREN + )? +; + func_decls : FUNCTIONS @@ -267,6 +297,7 @@ transform_decl SEMI ; + transform_decls: TRANSFORMERS LBRACE (transform_decl)* RBRACE ; diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java index 12e71a16a4..9e52ad8310 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java @@ -19,6 +19,7 @@ import de.uka.ilkd.key.rule.RuleSet; import org.key_project.util.collection.DefaultImmutableSet; +import org.key_project.util.collection.ImmutableSLList; import org.key_project.util.collection.ImmutableSet; import org.antlr.v4.runtime.Token; @@ -48,11 +49,25 @@ public DeclarationBuilder(Services services, NamespaceSet nss) { @Override public Object visitDecls(KeYParser.DeclsContext ctx) { - mapMapOf(ctx.option_decls(), ctx.options_choice(), ctx.ruleset_decls(), ctx.sort_decls(), + mapMapOf(ctx.option_decls(), ctx.options_choice(), ctx.ruleset_decls(), ctx.sort_decls(), ctx.datatype_decls(), ctx.prog_var_decls(), ctx.schema_var_decls()); return null; } + @Override + public Object visitDatatype_decl(KeYParser.Datatype_declContext ctx) { + boolean freeAdt = ctx.FREE() != null; + var name = ctx.name.getText(); + var s = new SortImpl(new Name(name)); + if (ctx.DOC_COMMENT() != null) { + var documentation = ctx.DOC_COMMENT().getText(); + s.setDocumentation(documentation); + } + s.setOrigin(BuilderHelpers.getPosition(ctx)); + sorts().add(s); + return null; + } + @Override public Object visitProg_var_decls(KeYParser.Prog_var_declsContext ctx) { for (int i = 0; i < ctx.simple_ident_comma_list().size(); i++) { diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java index 4792916542..43357ea896 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java @@ -13,6 +13,7 @@ import de.uka.ilkd.key.logic.op.Transformer; import de.uka.ilkd.key.logic.sort.GenericSort; import de.uka.ilkd.key.logic.sort.Sort; +import de.uka.ilkd.key.logic.sort.SortImpl; import de.uka.ilkd.key.nparser.KeYParser; import org.key_project.util.collection.ImmutableArray; @@ -43,7 +44,23 @@ public Object visitFile(KeYParser.FileContext ctx) { @Override public Object visitDecls(KeYParser.DeclsContext ctx) { - mapMapOf(ctx.pred_decls(), ctx.func_decls(), ctx.transform_decls()); + mapMapOf(ctx.pred_decls(), ctx.func_decls(), ctx.transform_decls(), ctx.datatype_decls()); + return null; + } + + @Override + public Object visitDatatype_decl(KeYParser.Datatype_declContext ctx) { + //boolean freeAdt = ctx.FREE() != null; + var sort = sorts().lookup(ctx.name.getText()); + for (KeYParser.Datatype_constructorContext constructorContext : ctx.datatype_constructor()) { + Name name = new Name(constructorContext.name.getText()); + Sort[] args = new Sort[constructorContext.sortId().size()]; + for (int i = 0; i < args.length; i++) { + args[i] = accept(constructorContext.sortId(i)); + } + Function function = new Function(name, sort, args); + namespaces().functions().add(function); + } return null; } 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 4e18e47629..292350638a 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 @@ -13,14 +13,12 @@ import de.uka.ilkd.key.java.abstraction.PrimitiveType; import de.uka.ilkd.key.java.abstraction.Type; import de.uka.ilkd.key.logic.*; -import de.uka.ilkd.key.logic.op.Modality; -import de.uka.ilkd.key.logic.op.Operator; -import de.uka.ilkd.key.logic.op.SchemaVariable; -import de.uka.ilkd.key.logic.op.SchemaVariableFactory; +import de.uka.ilkd.key.logic.op.*; import de.uka.ilkd.key.logic.sort.GenericSort; import de.uka.ilkd.key.logic.sort.ProgramSVSort; import de.uka.ilkd.key.logic.sort.Sort; import de.uka.ilkd.key.nparser.KeYParser; +import de.uka.ilkd.key.nparser.KeyAst; import de.uka.ilkd.key.nparser.varexp.ArgumentType; import de.uka.ilkd.key.nparser.varexp.TacletBuilderCommand; import de.uka.ilkd.key.nparser.varexp.TacletBuilderManipulators; @@ -29,6 +27,7 @@ import de.uka.ilkd.key.rule.conditions.TypeResolver; import de.uka.ilkd.key.rule.tacletbuilder.*; import de.uka.ilkd.key.util.Pair; +import de.uka.ilkd.key.settings.AbstractPropertiesSettings; import de.uka.ilkd.key.util.parsing.BuildingException; import org.key_project.util.collection.DefaultImmutableSet; @@ -80,6 +79,7 @@ public TacletPBuilder(Services services, NamespaceSet namespaces, public Object visitDecls(KeYParser.DeclsContext ctx) { mapOf(ctx.schema_var_decls()); mapOf(ctx.rulesOrAxioms()); + mapOf(ctx.datatype_decls()); return null; } @@ -229,6 +229,102 @@ private TacletBuilder peekTBuilder() { } + @Override + public Object visitDatatype_decl(KeYParser.Datatype_declContext ctx) { + var sort = sorts().lookup(ctx.name.getText()); + final var tb = services.getTermBuilder(); + + var phi = declareSchemaVariable(ctx, "phi", Sort.FORMULA, true, + false, false, new SchemaVariableModifierSet.FormulaSV()); + + var qvar = (VariableSV) declareSchemaVariable(ctx, "x", sort, + true, false, false, + new SchemaVariableModifierSet.VariableSV()); + + var find = tb.all(qvar, tb.var(phi)); // \forall #x #phi + + RewriteTacletBuilder b = new RewriteTacletBuilder<>(); + b.setName(new Name(sort.name() + "_id")); + b.setDisplayName("induction of " + sort.name()); + b.setFind(find); + + b.addVarsNotFreeIn(qvar, phi); + for (KeYParser.Datatype_constructorContext context : ctx.datatype_constructor()) { + var argSort = + context.argSort.stream() + .map(it -> sorts().lookup(it.getText())) + .collect(Collectors.toList()); + var argNames = + context.argName.stream() + .map(it -> it.getText()) + .collect(Collectors.toList()); + + var function = functions().lookup(context.name.getText()); + + Term[] args = new Term[argSort.size()]; + QuantifiableVariable[] qvs = new QuantifiableVariable[argSort.size()]; + for (int i = 0; i < args.length; i++) { + qvs[i] = new LogicVariable(new Name(argNames.get(i)), argSort.get(i)); + args[i] = tb.var(qvs[i]); + } + Term replacement = tb.func(function, args); + for (int i = qvs.length - 1; i >= 0; i--) { + replacement = tb.all(qvs[i], replacement); + } + + RewriteTacletGoalTemplate goal = new RewriteTacletGoalTemplate(replacement); + goal.setName("ind_" + sort.name() + "_" + context.name.getText()); + b.addTacletGoalTemplate(goal); + } + System.out.println(b.getTaclet()); + announceTaclet(ctx, b.getTaclet()); + + createConstructorSplit(ctx); + return null; + } + + private void createConstructorSplit(KeYParser.Datatype_declContext ctx) { + final var tb = services.getTermBuilder(); + + Map variables = new HashMap<>(); + for (KeYParser.Datatype_constructorContext context : ctx.datatype_constructor()) { + for (int i = 0; i < context.argName.size(); i++) { + var name = context.argName.get(i).getText(); + var sort = sorts().lookup(context.argSort.get(i).getText()); + var sv = declareSchemaVariable(ctx, name, sort, + false, true, false, + new SchemaVariableModifierSet.TermSV()); + variables.put(name, tb.var(sv)); + } + } + + final var b = new RewriteTacletBuilder<>(); + b.setApplicationRestriction(RewriteTaclet.SAME_UPDATE_LEVEL); + final var sort = sorts().lookup(ctx.name.getText()); + + b.setName(new Name(sort.name() + "_ctor_split")); + b.setDisplayName("case distinction of " + sort.name()); + + var phi = declareSchemaVariable(ctx, "var", sort, + false, false, false, + new SchemaVariableModifierSet.TermSV()); + b.setFind(tb.var(phi)); + for (KeYParser.Datatype_constructorContext context : ctx.datatype_constructor()) { + var func = functions().lookup(context.name.getText()); + Term[] args = new Term[context.argName.size()]; + for (int i = 0; i < args.length; i++) { + args[i] = variables.get(context.argName.get(i).getText()); + } + Semisequent antec = new Semisequent(new SequentFormula(tb.equals(tb.var(phi), tb.func(func, args)))); + Sequent addedSeq = Sequent.createAnteSequent(antec); + TacletGoalTemplate goal = new TacletGoalTemplate(addedSeq, ImmutableSLList.nil()); + goal.setName("#var = " + context.name.getText()); + b.addTacletGoalTemplate(goal); + } + System.out.println(b.getTaclet()); + announceTaclet(ctx, b.getTaclet()); + } + @Override public Object visitModifiers(KeYParser.ModifiersContext ctx) { TacletBuilder b = peekTBuilder(); @@ -688,7 +784,7 @@ public Object visitSchema_var_decls(KeYParser.Schema_var_declsContext ctx) { return this.mapOf(ctx.one_schema_var_decl()); } - protected void declareSchemaVariable(ParserRuleContext ctx, String name, Sort s, + protected SchemaVariable declareSchemaVariable(ParserRuleContext ctx, String name, Sort s, boolean makeVariableSV, boolean makeSkolemTermSV, boolean makeTermLabelSV, SchemaVariableModifierSet mods) { SchemaVariable v; @@ -727,6 +823,7 @@ protected void declareSchemaVariable(ParserRuleContext ctx, String name, Sort s, LOGGER.error("Override: {} {}", old, v); } schemaVariables().add(v); + return v; } public List getTopLevelTaclets() { diff --git a/key/test/enum.key b/key/test/enum.key new file mode 100644 index 0000000000..a567f2237a --- /dev/null +++ b/key/test/enum.key @@ -0,0 +1,7 @@ +\datatypes { + Enum = EA | EB | EC | ED; +} + +\problem { + \forall Enum e; ( e = EA() | e = EB() | e = EC() | e = ED()) +} \ No newline at end of file From c57feeaa89d60e9e828b59333a840d4f3f54ce33 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Thu, 8 Jun 2023 16:32:43 +0200 Subject: [PATCH 02/66] revival of ADTs trying to build more complex and correct taclets --- .../java/de/uka/ilkd/key/logic/Sequent.java | 4 +- .../java/de/uka/ilkd/key/nparser/KeyAst.java | 22 +- .../uka/ilkd/key/nparser/ParsingFacade.java | 11 + .../nparser/builder/DeclarationBuilder.java | 1 + .../key/nparser/builder/TacletPBuilder.java | 234 +++++++++++------- {key/test => test}/enum.key | 0 test/list.key | 10 + 7 files changed, 186 insertions(+), 96 deletions(-) rename {key/test => test}/enum.key (100%) create mode 100644 test/list.key diff --git a/key.core/src/main/java/de/uka/ilkd/key/logic/Sequent.java b/key.core/src/main/java/de/uka/ilkd/key/logic/Sequent.java index d33356e306..c29b712e96 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/logic/Sequent.java +++ b/key.core/src/main/java/de/uka/ilkd/key/logic/Sequent.java @@ -13,6 +13,8 @@ import org.key_project.util.collection.ImmutableList; import org.key_project.util.collection.ImmutableSLList; +import javax.annotation.Nonnull; + /** * This class represents a sequent. A sequent consists of an antecedent and succedent. As a sequent * is persistent there is no public constructor. @@ -83,7 +85,7 @@ private Sequent() { } /** creates new Sequent with antecedence and succedence */ - private Sequent(Semisequent antecedent, Semisequent succedent) { + private Sequent(@Nonnull Semisequent antecedent, @Nonnull Semisequent succedent) { assert !antecedent.isEmpty() || !succedent.isEmpty(); this.antecedent = antecedent; this.succedent = succedent; diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/KeyAst.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/KeyAst.java index 63f5b087be..8b61213f55 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/KeyAst.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/KeyAst.java @@ -3,10 +3,6 @@ * SPDX-License-Identifier: GPL-2.0-only */ package de.uka.ilkd.key.nparser; -import java.net.URL; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - import de.uka.ilkd.key.nparser.builder.BuilderHelpers; import de.uka.ilkd.key.nparser.builder.ChoiceFinder; import de.uka.ilkd.key.nparser.builder.FindProblemInformation; @@ -14,14 +10,16 @@ import de.uka.ilkd.key.proof.init.Includes; import de.uka.ilkd.key.settings.ProofSettings; import de.uka.ilkd.key.util.Triple; - -import org.key_project.util.java.StringUtil; - import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.misc.Interval; import org.antlr.v4.runtime.tree.ParseTreeVisitor; +import org.key_project.util.java.StringUtil; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.net.URL; /** * This is a monad around the parse tree. We use this class to hide the @@ -60,7 +58,7 @@ public static class File extends KeyAst { ProofSettings settings = new ProofSettings(ProofSettings.DEFAULT_SETTINGS); if (ctx.preferences() != null) { String text = - StringUtil.trim(ctx.preferences().s.getText(), '"').replace("\\\\:", ":"); + StringUtil.trim(ctx.preferences().s.getText(), '"').replace("\\\\:", ":"); settings.loadSettingsFromString(text); } return settings; @@ -71,7 +69,7 @@ public static class File extends KeyAst { KeYParser.ProofScriptContext pctx = ctx.problem().proofScript(); String text = pctx.ps.getText(); return new Triple<>(StringUtil.trim(text, '"'), pctx.ps.getLine(), - pctx.ps.getCharPositionInLine()); + pctx.ps.getCharPositionInLine()); } return null; } @@ -138,4 +136,10 @@ public static class Seq extends KeyAst { super(ctx); } } + + public static class Taclet extends KeyAst { + public Taclet(KeYParser.TacletContext taclet) { + super(taclet); + } + } } diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/ParsingFacade.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/ParsingFacade.java index 20a5e810f9..0a6d89ca1d 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/ParsingFacade.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/ParsingFacade.java @@ -192,4 +192,15 @@ public static String getValueDocumentation(@Nullable TerminalNode docComment) { String value = docComment.getText(); return value.substring(3, value.length() - 2);// remove leading "/*!" and trailing "*/" } + + public static KeyAst.Taclet parseTaclet(String source) { + return parseTaclet(CharStreams.fromString(source)); + } + + public static KeyAst.Taclet parseTaclet(CharStream source) { + KeYParser p = createParser(source); + var term = p.taclet(); + p.getErrorReporter().throwException(); + return new KeyAst.Taclet(term); + } } diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java index 9e52ad8310..6c9d16d9f4 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java @@ -11,6 +11,7 @@ import de.uka.ilkd.key.java.Services; import de.uka.ilkd.key.java.abstraction.KeYJavaType; import de.uka.ilkd.key.logic.*; +import de.uka.ilkd.key.logic.op.Function; import de.uka.ilkd.key.logic.op.LocationVariable; import de.uka.ilkd.key.logic.op.ProgramVariable; import de.uka.ilkd.key.logic.sort.*; 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 292350638a..b03f402ad9 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 @@ -3,11 +3,7 @@ * SPDX-License-Identifier: GPL-2.0-only */ package de.uka.ilkd.key.nparser.builder; -import java.util.*; -import java.util.stream.Collectors; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - +import antlr.RecognitionException; import de.uka.ilkd.key.java.Services; import de.uka.ilkd.key.java.abstraction.KeYJavaType; import de.uka.ilkd.key.java.abstraction.PrimitiveType; @@ -18,7 +14,6 @@ import de.uka.ilkd.key.logic.sort.ProgramSVSort; import de.uka.ilkd.key.logic.sort.Sort; import de.uka.ilkd.key.nparser.KeYParser; -import de.uka.ilkd.key.nparser.KeyAst; import de.uka.ilkd.key.nparser.varexp.ArgumentType; import de.uka.ilkd.key.nparser.varexp.TacletBuilderCommand; import de.uka.ilkd.key.nparser.varexp.TacletBuilderManipulators; @@ -29,18 +24,21 @@ import de.uka.ilkd.key.util.Pair; import de.uka.ilkd.key.settings.AbstractPropertiesSettings; import de.uka.ilkd.key.util.parsing.BuildingException; - +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.RuleContext; +import org.antlr.v4.runtime.Token; import org.key_project.util.collection.DefaultImmutableSet; import org.key_project.util.collection.ImmutableList; import org.key_project.util.collection.ImmutableSLList; import org.key_project.util.collection.ImmutableSet; - -import antlr.RecognitionException; -import org.antlr.v4.runtime.ParserRuleContext; -import org.antlr.v4.runtime.Token; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.*; +import java.util.stream.Collectors; + import static java.text.MessageFormat.format; public class TacletPBuilder extends ExpressionBuilder { @@ -70,7 +68,7 @@ public TacletPBuilder(Services services, NamespaceSet nss) { } public TacletPBuilder(Services services, NamespaceSet namespaces, - HashMap> taclet2Builder) { + HashMap> taclet2Builder) { this(services, namespaces); this.taclet2Builder = taclet2Builder; } @@ -221,7 +219,7 @@ public Taclet visitTaclet(KeYParser.TacletContext ctx) { private void announceTaclet(ParserRuleContext ctx, Taclet taclet) { taclet2Builder.put(taclet, peekTBuilder()); LOGGER.trace("Taclet announced: \"{}\" from {}:{}", taclet.name(), - ctx.start.getTokenSource().getSourceName(), ctx.start.getLine()); + ctx.start.getTokenSource().getSourceName(), ctx.start.getLine()); } private TacletBuilder peekTBuilder() { @@ -231,59 +229,124 @@ private TacletBuilder peekTBuilder() { @Override public Object visitDatatype_decl(KeYParser.Datatype_declContext ctx) { - var sort = sorts().lookup(ctx.name.getText()); - final var tb = services.getTermBuilder(); + var tbAx = createAxiomTaclet(ctx).getTaclet(); + System.out.println(tbAx); + announceTaclet(ctx, tbAx); + + var tbInd = createInductionTaclet(ctx).getTaclet(); + System.out.println(tbInd); + announceTaclet(ctx, tbInd); + + var tbSplit = createConstructorSplit(ctx).getTaclet(); + System.out.println(tbSplit); + announceTaclet(ctx, tbSplit); + return null; + } + + private TacletBuilder createInductionTaclet(KeYParser.Datatype_declContext ctx) { + var tacletBuilder = new NoFindTacletBuilder(); + tacletBuilder.setName(new Name(String.format("%s_Ind", ctx.name.getText()))); + final var sort = sorts().lookup(ctx.name.getText()); var phi = declareSchemaVariable(ctx, "phi", Sort.FORMULA, true, false, false, new SchemaVariableModifierSet.FormulaSV()); + var tb = services.getTermBuilder(); + var qvar = (VariableSV) declareSchemaVariable(ctx, "x", sort, + true, false, false, + new SchemaVariableModifierSet.VariableSV()); + //tacletBuilder.addVarsNotFreeIn(qvar, phi); + var cases = ctx.datatype_constructor().stream() + .map(it -> createGoalDtConstructor(it, qvar, tb.var(phi), sort)) + .collect(Collectors.toList()); + + var use = tb.all(qvar, tb.var(phi)); + var useCase = new TacletGoalTemplate( + Sequent.createAnteSequent(new Semisequent(new SequentFormula(use))), ImmutableSLList.nil()); + useCase.setName("Use case of " + ctx.name.getText()); + cases.add(useCase); + + cases.forEach(tacletBuilder::addTacletGoalTemplate); + tacletBuilder.setDisplayName("Induction for " + sort.name()); + return tacletBuilder; + } + + private TacletGoalTemplate createGoalDtConstructor(KeYParser.Datatype_constructorContext it, + VariableSV qvar, Term var, Sort sort) { + var constr = createQuantifiedFormula(it, qvar, var, sort); + var goal = new TacletGoalTemplate( + Sequent.createSuccSequent(new Semisequent(new SequentFormula(constr))), + ImmutableSLList.nil()); + goal.setName(it.getText()); + return goal; + } + + + private RewriteTacletBuilder createAxiomTaclet(KeYParser.Datatype_declContext ctx) { + var tacletBuilder = new RewriteTacletBuilder<>(); + tacletBuilder.setName(new Name(String.format("%s_Axiom", ctx.name.getText()))); + final var sort = sorts().lookup(ctx.name.getText()); + var phi = declareSchemaVariable(ctx, "phi", Sort.FORMULA, true, + false, false, new SchemaVariableModifierSet.FormulaSV()); + var tb = services.getTermBuilder(); var qvar = (VariableSV) declareSchemaVariable(ctx, "x", sort, true, false, false, new SchemaVariableModifierSet.VariableSV()); + var find = tb.all(qvar, tb.var(phi)); // \forall #x #phi + tacletBuilder.setFind(find); + tacletBuilder.addVarsNotFreeIn(qvar, phi); - var find = tb.all(qvar, tb.var(phi)); // \forall #x #phi + var cases = ctx.datatype_constructor().stream().map(it -> createQuantifiedFormula(it, qvar, tb.var(phi), sort)) + .collect(Collectors.toList()); - RewriteTacletBuilder b = new RewriteTacletBuilder<>(); - b.setName(new Name(sort.name() + "_id")); - b.setDisplayName("induction of " + sort.name()); - b.setFind(find); + var axiom = tb.equals(find, tb.and(cases)); - b.addVarsNotFreeIn(qvar, phi); - for (KeYParser.Datatype_constructorContext context : ctx.datatype_constructor()) { - var argSort = - context.argSort.stream() - .map(it -> sorts().lookup(it.getText())) - .collect(Collectors.toList()); - var argNames = - context.argName.stream() - .map(it -> it.getText()) - .collect(Collectors.toList()); - - var function = functions().lookup(context.name.getText()); - - Term[] args = new Term[argSort.size()]; - QuantifiableVariable[] qvs = new QuantifiableVariable[argSort.size()]; - for (int i = 0; i < args.length; i++) { - qvs[i] = new LogicVariable(new Name(argNames.get(i)), argSort.get(i)); - args[i] = tb.var(qvs[i]); - } - Term replacement = tb.func(function, args); - for (int i = qvs.length - 1; i >= 0; i--) { - replacement = tb.all(qvs[i], replacement); - } + var goal = new TacletGoalTemplate(Sequent.createAnteSequent(new Semisequent(new SequentFormula(axiom))), + ImmutableSLList.nil()); + tacletBuilder.addTacletGoalTemplate(goal); - RewriteTacletGoalTemplate goal = new RewriteTacletGoalTemplate(replacement); - goal.setName("ind_" + sort.name() + "_" + context.name.getText()); - b.addTacletGoalTemplate(goal); + tacletBuilder.setDisplayName("Axiom for " + sort.name()); + return tacletBuilder; + } + + private Term createQuantifiedFormula(KeYParser.Datatype_constructorContext context, + QuantifiableVariable qvX, Term phi, Sort dt) { + var tb = services.getTermBuilder(); + var fn = functions().lookup(context.name.getText()); + if (context.argName.size() == 0) return tb.subst(qvX, tb.func(fn), phi); + + var args = new Term[context.argName.size()]; + + var argSort = + context.argSort.stream() + .map(it -> sorts().lookup(it.getText())) + .collect(Collectors.toList()); + var argNames = + context.argName.stream() + .map(RuleContext::getText) + .collect(Collectors.toList()); + var qvs = new ArrayList(args.length); + var ind = new ArrayList(args.length); + + for (int i = 0; i < argSort.size(); i++) { + final var qv = new LogicVariable(new Name(argNames.get(i)), argSort.get(i)); + qvs.add(qv); + args[i] = services.getTermFactory().createTerm(qvs.get(i)); + + if (argSort.get(i).equals(dt)) { + ind.add(tb.subst(qvX, args[i], phi)); + } } - System.out.println(b.getTaclet()); - announceTaclet(ctx, b.getTaclet()); - createConstructorSplit(ctx); - return null; + if (ind.isEmpty()) { + return tb.all(qvs, tb.func(fn, args)); + } else { + var base = tb.and(ind); + return tb.all(qvs, tb.imp(base, tb.subst(qvX, tb.func(fn, args), phi))); + } } - private void createConstructorSplit(KeYParser.Datatype_declContext ctx) { + private RewriteTacletBuilder createConstructorSplit(KeYParser.Datatype_declContext ctx) { final var tb = services.getTermBuilder(); Map variables = new HashMap<>(); @@ -321,8 +384,7 @@ private void createConstructorSplit(KeYParser.Datatype_declContext ctx) { goal.setName("#var = " + context.name.getText()); b.addTacletGoalTemplate(goal); } - System.out.println(b.getTaclet()); - announceTaclet(ctx, b.getTaclet()); + return b; } @Override @@ -360,9 +422,9 @@ public Object visitVarexp(KeYParser.VarexpContext ctx) { String name = ctx.varexpId().getText(); List arguments = ctx.varexp_argument(); List suitableManipulators = - TacletBuilderManipulators.getConditionBuildersFor(name); + TacletBuilderManipulators.getConditionBuildersFor(name); List parameters = - ctx.parameter.stream().map(Token::getText).collect(Collectors.toList()); + ctx.parameter.stream().map(Token::getText).collect(Collectors.toList()); boolean applied = false; Object[] argCache = new Object[arguments.size()]; for (TacletBuilderCommand manipulator : suitableManipulators) { @@ -381,8 +443,8 @@ public Object visitVarexp(KeYParser.VarexpContext ctx) { } private boolean applyManipulator(boolean negated, Object[] args, - TacletBuilderCommand manipulator, List arguments, - List parameters) { + TacletBuilderCommand manipulator, List arguments, + List parameters) { assert args.length == arguments.size(); ArgumentType[] types = manipulator.getArgumentTypes(); @@ -401,24 +463,24 @@ private boolean applyManipulator(boolean negated, Object[] args, } private Object evaluateVarcondArgument(ArgumentType expectedType, Object prevValue, - KeYParser.Varexp_argumentContext ctx) { + KeYParser.Varexp_argumentContext ctx) { if (prevValue != null && expectedType.clazz.isAssignableFrom(prevValue.getClass())) { return prevValue; // previous value is of suitable type, we do not re-evaluate } switch (expectedType) { - case TYPE_RESOLVER: - return buildTypeResolver(ctx); - case SORT: + case TYPE_RESOLVER: + return buildTypeResolver(ctx); + case SORT: return visitSortId(ctx.term().getText(), ctx.term()); - case JAVA_TYPE: + case JAVA_TYPE: return getOrCreateJavaType(ctx.term().getText(), ctx); - case VARIABLE: - return varId(ctx, ctx.getText()); - case STRING: - return ctx.getText(); - case TERM: - return accept(ctx.term()); + case VARIABLE: + return varId(ctx, ctx.getText()); + case STRING: + return ctx.getText(); + case TERM: + return accept(ctx.term()); } assert false; return null; @@ -596,7 +658,7 @@ public ImmutableList visitTacletlist(KeYParser.TacletlistContext ctx) { @Nonnull private TacletBuilder createTacletBuilderFor(Object find, int applicationRestriction, - ParserRuleContext ctx) { + ParserRuleContext ctx) { if (find == null) { return new NoFindTacletBuilder(); } else if (find instanceof Term) { @@ -610,14 +672,14 @@ private TacletBuilder createTacletBuilderFor(Object find, int applicationRest AntecTacletBuilder b = new AntecTacletBuilder(); b.setFind(findFma); b.setIgnoreTopLevelUpdates( - (applicationRestriction & RewriteTaclet.IN_SEQUENT_STATE) == 0); + (applicationRestriction & RewriteTaclet.IN_SEQUENT_STATE) == 0); return b; } else if (findSeq.antecedent().size() == 0 && findSeq.succedent().size() == 1) { Term findFma = findSeq.succedent().get(0).formula(); SuccTacletBuilder b = new SuccTacletBuilder(); b.setFind(findFma); b.setIgnoreTopLevelUpdates( - (applicationRestriction & RewriteTaclet.IN_SEQUENT_STATE) == 0); + (applicationRestriction & RewriteTaclet.IN_SEQUENT_STATE) == 0); return b; } else { semanticError(ctx, "Unknown find-sequent (perhaps null?):" + findSeq); @@ -627,12 +689,12 @@ private TacletBuilder createTacletBuilderFor(Object find, int applicationRest } throw new IllegalArgumentException( - format("Could not find a suitable TacletBuilder for {0}", find)); + format("Could not find a suitable TacletBuilder for {0}", find)); } private void addGoalTemplate(String id, Object rwObj, Sequent addSeq, - ImmutableList addRList, ImmutableSet pvs, - @Nullable ChoiceExpr soc, ParserRuleContext ctx) { + ImmutableList addRList, ImmutableSet pvs, + @Nullable ChoiceExpr soc, ParserRuleContext ctx) { TacletBuilder b = peekTBuilder(); TacletGoalTemplate gt = null; if (rwObj == null) { @@ -647,7 +709,7 @@ private void addGoalTemplate(String id, Object rwObj, Sequent addSeq, gt = new AntecSuccTacletGoalTemplate(addSeq, addRList, (Sequent) rwObj, pvs); } else { semanticError(ctx, // new UnfittingReplacewithException - "Replacewith in a Antec-or SuccTaclet has to contain a sequent (not a term)"); + "Replacewith in a Antec-or SuccTaclet has to contain a sequent (not a term)"); } } else if (b instanceof RewriteTacletBuilder) { @@ -656,13 +718,13 @@ private void addGoalTemplate(String id, Object rwObj, Sequent addSeq, } else { // throwEx(/new UnfittingReplacewithException semanticError(ctx, - "Replacewith in a RewriteTaclet has to contain a term (not a sequent)"); + "Replacewith in a RewriteTaclet has to contain a term (not a sequent)"); } } } if (gt == null) { throw new NullPointerException( - "Could not find a suitable goal template builder for: " + b.getClass()); + "Could not find a suitable goal template builder for: " + b.getClass()); } gt.setName(id); b.addTacletGoalTemplate(gt); @@ -761,7 +823,7 @@ public Object visitOne_schema_var_decl(KeYParser.One_schema_var_declContext ctx) for (String id : ids) { declareSchemaVariable(ctx, id, s, makeVariableSV, makeSkolemTermSV, makeTermLabelSV, - mods); + mods); } return null; } @@ -773,7 +835,7 @@ public Object visitSchema_modifiers(KeYParser.Schema_modifiersContext ctx) { for (String id : ids) { if (!mods.addModifier(id)) { semanticError(ctx, - "Illegal or unknown modifier in declaration of schema variable: %s", id); + "Illegal or unknown modifier in declaration of schema variable: %s", id); } } return null; @@ -785,8 +847,8 @@ public Object visitSchema_var_decls(KeYParser.Schema_var_declsContext ctx) { } protected SchemaVariable declareSchemaVariable(ParserRuleContext ctx, String name, Sort s, - boolean makeVariableSV, boolean makeSkolemTermSV, boolean makeTermLabelSV, - SchemaVariableModifierSet mods) { + boolean makeVariableSV, boolean makeSkolemTermSV, boolean makeTermLabelSV, + SchemaVariableModifierSet mods) { SchemaVariable v; if (s == Sort.FORMULA && !makeSkolemTermSV) { v = SchemaVariableFactory.createFormulaSV(new Name(name), mods.rigid()); @@ -794,7 +856,7 @@ protected SchemaVariable declareSchemaVariable(ParserRuleContext ctx, String nam v = SchemaVariableFactory.createUpdateSV(new Name(name)); } else if (s instanceof ProgramSVSort) { v = SchemaVariableFactory.createProgramSV(new ProgramElementName(name), - (ProgramSVSort) s, mods.list()); + (ProgramSVSort) s, mods.list()); } else { if (makeVariableSV) { v = SchemaVariableFactory.createVariableSV(new Name(name), s); @@ -804,21 +866,21 @@ protected SchemaVariable declareSchemaVariable(ParserRuleContext ctx, String nam v = SchemaVariableFactory.createTermLabelSV(new Name(name)); } else { v = SchemaVariableFactory.createTermSV(new Name(name), s, mods.rigid(), - mods.strict()); + mods.strict()); } } if (variables().lookup(v.name()) != null) { semanticError(null, "Schema variables shadows previous declared variable: %s.", - v.name()); + v.name()); } if (schemaVariables().lookup(v.name()) != null) { SchemaVariable old = schemaVariables().lookup(v.name()); if (!old.sort().equals(v.sort())) { semanticError(null, - "Schema variables clashes with previous declared schema variable: %s.", - v.name()); + "Schema variables clashes with previous declared schema variable: %s.", + v.name()); } LOGGER.error("Override: {} {}", old, v); } diff --git a/key/test/enum.key b/test/enum.key similarity index 100% rename from key/test/enum.key rename to test/enum.key diff --git a/test/list.key b/test/list.key new file mode 100644 index 0000000000..92d60f5682 --- /dev/null +++ b/test/list.key @@ -0,0 +1,10 @@ +\datatypes { + MyList = MNil | MCons(any head, MyList tail); +} + +\functions { int size(MyList); } + +\problem { + \forall MyList l2; \forall MyList l1; + (size(l2) + size(l1)) = (size(l1) + size(l2)) +} \ No newline at end of file From dab882967fb01ccc215ce46eb122b7f682ec2d52 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Thu, 8 Jun 2023 16:36:22 +0200 Subject: [PATCH 03/66] better printing --- .../uka/ilkd/key/nparser/builder/TacletPBuilder.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) 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 b03f402ad9..1179e0c69a 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 @@ -18,6 +18,9 @@ import de.uka.ilkd.key.nparser.varexp.TacletBuilderCommand; import de.uka.ilkd.key.nparser.varexp.TacletBuilderManipulators; import de.uka.ilkd.key.parser.SchemaVariableModifierSet; +import de.uka.ilkd.key.pp.LogicPrinter; +import de.uka.ilkd.key.pp.NotationInfo; +import de.uka.ilkd.key.pp.PosTableLayouter; import de.uka.ilkd.key.rule.*; import de.uka.ilkd.key.rule.conditions.TypeResolver; import de.uka.ilkd.key.rule.tacletbuilder.*; @@ -229,18 +232,20 @@ private TacletBuilder peekTBuilder() { @Override public Object visitDatatype_decl(KeYParser.Datatype_declContext ctx) { + LogicPrinter lp = new LogicPrinter(new NotationInfo(), services, new PosTableLayouter(100, 4, true)); var tbAx = createAxiomTaclet(ctx).getTaclet(); - System.out.println(tbAx); + lp.printTaclet(tbAx); announceTaclet(ctx, tbAx); var tbInd = createInductionTaclet(ctx).getTaclet(); - System.out.println(tbInd); + lp.printTaclet(tbInd); announceTaclet(ctx, tbInd); var tbSplit = createConstructorSplit(ctx).getTaclet(); - System.out.println(tbSplit); + lp.printTaclet(tbSplit); announceTaclet(ctx, tbSplit); + System.out.println(lp.result()); return null; } From f20ff3ddda07077f0f67a770aebf2f985a0a2142 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Fri, 9 Jun 2023 09:39:01 +0200 Subject: [PATCH 04/66] solve that taclets are unknown --- .../key/nparser/builder/TacletPBuilder.java | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) 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 1179e0c69a..90623099f6 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 @@ -170,7 +170,7 @@ public Taclet visitTaclet(KeYParser.TacletContext ctx) { b.setAnnotations(tacletAnnotations); b.setOrigin(BuilderHelpers.getPosition(ctx)); Taclet r = b.getTaclet(); - announceTaclet(ctx, r); + registerTaclet(ctx, r); currentTBuilder.pop(); return r; } @@ -210,7 +210,7 @@ public Taclet visitTaclet(KeYParser.TacletContext ctx) { b.setOrigin(BuilderHelpers.getPosition(ctx)); try { Taclet r = peekTBuilder().getTaclet(); - announceTaclet(ctx, r); + registerTaclet(ctx, r); setSchemaVariables(schemaVariables().parent()); currentTBuilder.pop(); return r; @@ -219,7 +219,17 @@ public Taclet visitTaclet(KeYParser.TacletContext ctx) { } } - private void announceTaclet(ParserRuleContext ctx, Taclet taclet) { + private void registerTaclet(KeYParser.Datatype_declContext ctx, TacletBuilder tb) { + LogicPrinter lp = new LogicPrinter(new NotationInfo(), services, new PosTableLayouter(100, 4, true)); + var taclet = tb.getTaclet(); + taclet2Builder.put(taclet, peekTBuilder()); + topLevelTaclets.add(taclet); + LOGGER.trace("Taclet announced: \"{}\" from {}:{}", taclet.name(), + ctx.start.getTokenSource().getSourceName(), ctx.start.getLine()); + System.out.println(lp.result()); + } + + private void registerTaclet(ParserRuleContext ctx, Taclet taclet) { taclet2Builder.put(taclet, peekTBuilder()); LOGGER.trace("Taclet announced: \"{}\" from {}:{}", taclet.name(), ctx.start.getTokenSource().getSourceName(), ctx.start.getLine()); @@ -232,23 +242,19 @@ private TacletBuilder peekTBuilder() { @Override public Object visitDatatype_decl(KeYParser.Datatype_declContext ctx) { - LogicPrinter lp = new LogicPrinter(new NotationInfo(), services, new PosTableLayouter(100, 4, true)); - var tbAx = createAxiomTaclet(ctx).getTaclet(); - lp.printTaclet(tbAx); - announceTaclet(ctx, tbAx); + var tbAx = createAxiomTaclet(ctx); + registerTaclet(ctx, tbAx); - var tbInd = createInductionTaclet(ctx).getTaclet(); - lp.printTaclet(tbInd); - announceTaclet(ctx, tbInd); + var tbInd = createInductionTaclet(ctx); + registerTaclet(ctx, tbInd); - var tbSplit = createConstructorSplit(ctx).getTaclet(); - lp.printTaclet(tbSplit); - announceTaclet(ctx, tbSplit); + var tbSplit = createConstructorSplit(ctx); + registerTaclet(ctx, tbSplit); - System.out.println(lp.result()); return null; } + private TacletBuilder createInductionTaclet(KeYParser.Datatype_declContext ctx) { var tacletBuilder = new NoFindTacletBuilder(); tacletBuilder.setName(new Name(String.format("%s_Ind", ctx.name.getText()))); From 639b60467fdd29e42d71d7066dd1584c72030b5c Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Fri, 9 Jun 2023 15:39:23 +0200 Subject: [PATCH 05/66] solve double declaration of sorts, functions and taclets --- .../java/de/uka/ilkd/key/logic/Sequent.java | 3 +- .../java/de/uka/ilkd/key/nparser/KeyAst.java | 16 +- .../nparser/builder/DeclarationBuilder.java | 5 +- .../builder/FunctionPredicateBuilder.java | 6 +- .../key/nparser/builder/TacletPBuilder.java | 163 ++++++++++-------- .../key/proof/init/KeYUserProblemFile.java | 7 +- 6 files changed, 106 insertions(+), 94 deletions(-) diff --git a/key.core/src/main/java/de/uka/ilkd/key/logic/Sequent.java b/key.core/src/main/java/de/uka/ilkd/key/logic/Sequent.java index c29b712e96..570e855630 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/logic/Sequent.java +++ b/key.core/src/main/java/de/uka/ilkd/key/logic/Sequent.java @@ -6,6 +6,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Set; +import javax.annotation.Nonnull; import de.uka.ilkd.key.logic.label.TermLabel; import de.uka.ilkd.key.logic.op.QuantifiableVariable; @@ -13,8 +14,6 @@ import org.key_project.util.collection.ImmutableList; import org.key_project.util.collection.ImmutableSLList; -import javax.annotation.Nonnull; - /** * This class represents a sequent. A sequent consists of an antecedent and succedent. As a sequent * is persistent there is no public constructor. diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/KeyAst.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/KeyAst.java index 8b61213f55..785992b16d 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/KeyAst.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/KeyAst.java @@ -3,6 +3,10 @@ * SPDX-License-Identifier: GPL-2.0-only */ package de.uka.ilkd.key.nparser; +import java.net.URL; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + import de.uka.ilkd.key.nparser.builder.BuilderHelpers; import de.uka.ilkd.key.nparser.builder.ChoiceFinder; import de.uka.ilkd.key.nparser.builder.FindProblemInformation; @@ -10,16 +14,14 @@ import de.uka.ilkd.key.proof.init.Includes; import de.uka.ilkd.key.settings.ProofSettings; import de.uka.ilkd.key.util.Triple; + +import org.key_project.util.java.StringUtil; + import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.misc.Interval; import org.antlr.v4.runtime.tree.ParseTreeVisitor; -import org.key_project.util.java.StringUtil; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.net.URL; /** * This is a monad around the parse tree. We use this class to hide the @@ -58,7 +60,7 @@ public static class File extends KeyAst { ProofSettings settings = new ProofSettings(ProofSettings.DEFAULT_SETTINGS); if (ctx.preferences() != null) { String text = - StringUtil.trim(ctx.preferences().s.getText(), '"').replace("\\\\:", ":"); + StringUtil.trim(ctx.preferences().s.getText(), '"').replace("\\\\:", ":"); settings.loadSettingsFromString(text); } return settings; @@ -69,7 +71,7 @@ public static class File extends KeyAst { KeYParser.ProofScriptContext pctx = ctx.problem().proofScript(); String text = pctx.ps.getText(); return new Triple<>(StringUtil.trim(text, '"'), pctx.ps.getLine(), - pctx.ps.getCharPositionInLine()); + pctx.ps.getCharPositionInLine()); } return null; } diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java index 6c9d16d9f4..2fbfa0b20e 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java @@ -11,7 +11,6 @@ import de.uka.ilkd.key.java.Services; import de.uka.ilkd.key.java.abstraction.KeYJavaType; import de.uka.ilkd.key.logic.*; -import de.uka.ilkd.key.logic.op.Function; import de.uka.ilkd.key.logic.op.LocationVariable; import de.uka.ilkd.key.logic.op.ProgramVariable; import de.uka.ilkd.key.logic.sort.*; @@ -20,7 +19,6 @@ import de.uka.ilkd.key.rule.RuleSet; import org.key_project.util.collection.DefaultImmutableSet; -import org.key_project.util.collection.ImmutableSLList; import org.key_project.util.collection.ImmutableSet; import org.antlr.v4.runtime.Token; @@ -50,7 +48,8 @@ public DeclarationBuilder(Services services, NamespaceSet nss) { @Override public Object visitDecls(KeYParser.DeclsContext ctx) { - mapMapOf(ctx.option_decls(), ctx.options_choice(), ctx.ruleset_decls(), ctx.sort_decls(), ctx.datatype_decls(), + mapMapOf(ctx.option_decls(), ctx.options_choice(), ctx.ruleset_decls(), ctx.sort_decls(), + ctx.datatype_decls(), ctx.prog_var_decls(), ctx.schema_var_decls()); return null; } diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java index 43357ea896..67554a6048 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java @@ -13,7 +13,6 @@ import de.uka.ilkd.key.logic.op.Transformer; import de.uka.ilkd.key.logic.sort.GenericSort; import de.uka.ilkd.key.logic.sort.Sort; -import de.uka.ilkd.key.logic.sort.SortImpl; import de.uka.ilkd.key.nparser.KeYParser; import org.key_project.util.collection.ImmutableArray; @@ -50,9 +49,10 @@ public Object visitDecls(KeYParser.DeclsContext ctx) { @Override public Object visitDatatype_decl(KeYParser.Datatype_declContext ctx) { - //boolean freeAdt = ctx.FREE() != null; + // boolean freeAdt = ctx.FREE() != null; var sort = sorts().lookup(ctx.name.getText()); - for (KeYParser.Datatype_constructorContext constructorContext : ctx.datatype_constructor()) { + for (KeYParser.Datatype_constructorContext constructorContext : ctx + .datatype_constructor()) { Name name = new Name(constructorContext.name.getText()); Sort[] args = new Sort[constructorContext.sortId().size()]; for (int i = 0; i < args.length; i++) { 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 90623099f6..658f380737 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 @@ -3,7 +3,11 @@ * SPDX-License-Identifier: GPL-2.0-only */ package de.uka.ilkd.key.nparser.builder; -import antlr.RecognitionException; +import java.util.*; +import java.util.stream.Collectors; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + import de.uka.ilkd.key.java.Services; import de.uka.ilkd.key.java.abstraction.KeYJavaType; import de.uka.ilkd.key.java.abstraction.PrimitiveType; @@ -27,21 +31,19 @@ import de.uka.ilkd.key.util.Pair; import de.uka.ilkd.key.settings.AbstractPropertiesSettings; import de.uka.ilkd.key.util.parsing.BuildingException; -import org.antlr.v4.runtime.ParserRuleContext; -import org.antlr.v4.runtime.RuleContext; -import org.antlr.v4.runtime.Token; + import org.key_project.util.collection.DefaultImmutableSet; import org.key_project.util.collection.ImmutableList; import org.key_project.util.collection.ImmutableSLList; import org.key_project.util.collection.ImmutableSet; + +import antlr.RecognitionException; +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.RuleContext; +import org.antlr.v4.runtime.Token; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.*; -import java.util.stream.Collectors; - import static java.text.MessageFormat.format; public class TacletPBuilder extends ExpressionBuilder { @@ -71,7 +73,7 @@ public TacletPBuilder(Services services, NamespaceSet nss) { } public TacletPBuilder(Services services, NamespaceSet namespaces, - HashMap> taclet2Builder) { + HashMap> taclet2Builder) { this(services, namespaces); this.taclet2Builder = taclet2Builder; } @@ -220,19 +222,20 @@ public Taclet visitTaclet(KeYParser.TacletContext ctx) { } private void registerTaclet(KeYParser.Datatype_declContext ctx, TacletBuilder tb) { - LogicPrinter lp = new LogicPrinter(new NotationInfo(), services, new PosTableLayouter(100, 4, true)); + LogicPrinter lp = + new LogicPrinter(new NotationInfo(), services, new PosTableLayouter(100, 4, true)); var taclet = tb.getTaclet(); taclet2Builder.put(taclet, peekTBuilder()); topLevelTaclets.add(taclet); LOGGER.trace("Taclet announced: \"{}\" from {}:{}", taclet.name(), - ctx.start.getTokenSource().getSourceName(), ctx.start.getLine()); + ctx.start.getTokenSource().getSourceName(), ctx.start.getLine()); System.out.println(lp.result()); } private void registerTaclet(ParserRuleContext ctx, Taclet taclet) { taclet2Builder.put(taclet, peekTBuilder()); LOGGER.trace("Taclet announced: \"{}\" from {}:{}", taclet.name(), - ctx.start.getTokenSource().getSourceName(), ctx.start.getLine()); + ctx.start.getTokenSource().getSourceName(), ctx.start.getLine()); } private TacletBuilder peekTBuilder() { @@ -255,17 +258,18 @@ public Object visitDatatype_decl(KeYParser.Datatype_declContext ctx) { } - private TacletBuilder createInductionTaclet(KeYParser.Datatype_declContext ctx) { + private TacletBuilder createInductionTaclet( + KeYParser.Datatype_declContext ctx) { var tacletBuilder = new NoFindTacletBuilder(); tacletBuilder.setName(new Name(String.format("%s_Ind", ctx.name.getText()))); final var sort = sorts().lookup(ctx.name.getText()); var phi = declareSchemaVariable(ctx, "phi", Sort.FORMULA, true, - false, false, new SchemaVariableModifierSet.FormulaSV()); + false, false, new SchemaVariableModifierSet.FormulaSV()); var tb = services.getTermBuilder(); var qvar = (VariableSV) declareSchemaVariable(ctx, "x", sort, - true, false, false, - new SchemaVariableModifierSet.VariableSV()); - //tacletBuilder.addVarsNotFreeIn(qvar, phi); + true, false, false, + new SchemaVariableModifierSet.VariableSV()); + // tacletBuilder.addVarsNotFreeIn(qvar, phi); var cases = ctx.datatype_constructor().stream() .map(it -> createGoalDtConstructor(it, qvar, tb.var(phi), sort)) @@ -273,7 +277,8 @@ private TacletBuilder createInductionTaclet(KeYParser.Datatype var use = tb.all(qvar, tb.var(phi)); var useCase = new TacletGoalTemplate( - Sequent.createAnteSequent(new Semisequent(new SequentFormula(use))), ImmutableSLList.nil()); + Sequent.createAnteSequent(new Semisequent(new SequentFormula(use))), + ImmutableSLList.nil()); useCase.setName("Use case of " + ctx.name.getText()); cases.add(useCase); @@ -283,37 +288,40 @@ private TacletBuilder createInductionTaclet(KeYParser.Datatype } private TacletGoalTemplate createGoalDtConstructor(KeYParser.Datatype_constructorContext it, - VariableSV qvar, Term var, Sort sort) { + VariableSV qvar, Term var, Sort sort) { var constr = createQuantifiedFormula(it, qvar, var, sort); var goal = new TacletGoalTemplate( - Sequent.createSuccSequent(new Semisequent(new SequentFormula(constr))), - ImmutableSLList.nil()); + Sequent.createSuccSequent(new Semisequent(new SequentFormula(constr))), + ImmutableSLList.nil()); goal.setName(it.getText()); return goal; } - private RewriteTacletBuilder createAxiomTaclet(KeYParser.Datatype_declContext ctx) { + private RewriteTacletBuilder createAxiomTaclet( + KeYParser.Datatype_declContext ctx) { var tacletBuilder = new RewriteTacletBuilder<>(); tacletBuilder.setName(new Name(String.format("%s_Axiom", ctx.name.getText()))); final var sort = sorts().lookup(ctx.name.getText()); var phi = declareSchemaVariable(ctx, "phi", Sort.FORMULA, true, - false, false, new SchemaVariableModifierSet.FormulaSV()); + false, false, new SchemaVariableModifierSet.FormulaSV()); var tb = services.getTermBuilder(); var qvar = (VariableSV) declareSchemaVariable(ctx, "x", sort, - true, false, false, - new SchemaVariableModifierSet.VariableSV()); + true, false, false, + new SchemaVariableModifierSet.VariableSV()); var find = tb.all(qvar, tb.var(phi)); // \forall #x #phi tacletBuilder.setFind(find); tacletBuilder.addVarsNotFreeIn(qvar, phi); - var cases = ctx.datatype_constructor().stream().map(it -> createQuantifiedFormula(it, qvar, tb.var(phi), sort)) + var cases = ctx.datatype_constructor().stream() + .map(it -> createQuantifiedFormula(it, qvar, tb.var(phi), sort)) .collect(Collectors.toList()); var axiom = tb.equals(find, tb.and(cases)); - var goal = new TacletGoalTemplate(Sequent.createAnteSequent(new Semisequent(new SequentFormula(axiom))), - ImmutableSLList.nil()); + var goal = new TacletGoalTemplate( + Sequent.createAnteSequent(new Semisequent(new SequentFormula(axiom))), + ImmutableSLList.nil()); tacletBuilder.addTacletGoalTemplate(goal); tacletBuilder.setDisplayName("Axiom for " + sort.name()); @@ -321,21 +329,22 @@ private RewriteTacletBuilder createAxiomTaclet(KeYParser.Datatype } private Term createQuantifiedFormula(KeYParser.Datatype_constructorContext context, - QuantifiableVariable qvX, Term phi, Sort dt) { + QuantifiableVariable qvX, Term phi, Sort dt) { var tb = services.getTermBuilder(); var fn = functions().lookup(context.name.getText()); - if (context.argName.size() == 0) return tb.subst(qvX, tb.func(fn), phi); + if (context.argName.size() == 0) + return tb.subst(qvX, tb.func(fn), phi); var args = new Term[context.argName.size()]; var argSort = - context.argSort.stream() - .map(it -> sorts().lookup(it.getText())) - .collect(Collectors.toList()); + context.argSort.stream() + .map(it -> sorts().lookup(it.getText())) + .collect(Collectors.toList()); var argNames = - context.argName.stream() - .map(RuleContext::getText) - .collect(Collectors.toList()); + context.argName.stream() + .map(RuleContext::getText) + .collect(Collectors.toList()); var qvs = new ArrayList(args.length); var ind = new ArrayList(args.length); @@ -357,7 +366,8 @@ private Term createQuantifiedFormula(KeYParser.Datatype_constructorContext conte } } - private RewriteTacletBuilder createConstructorSplit(KeYParser.Datatype_declContext ctx) { + private RewriteTacletBuilder createConstructorSplit( + KeYParser.Datatype_declContext ctx) { final var tb = services.getTermBuilder(); Map variables = new HashMap<>(); @@ -366,8 +376,8 @@ private RewriteTacletBuilder createConstructorSplit(KeYParser.Dat var name = context.argName.get(i).getText(); var sort = sorts().lookup(context.argSort.get(i).getText()); var sv = declareSchemaVariable(ctx, name, sort, - false, true, false, - new SchemaVariableModifierSet.TermSV()); + false, true, false, + new SchemaVariableModifierSet.TermSV()); variables.put(name, tb.var(sv)); } } @@ -380,8 +390,8 @@ private RewriteTacletBuilder createConstructorSplit(KeYParser.Dat b.setDisplayName("case distinction of " + sort.name()); var phi = declareSchemaVariable(ctx, "var", sort, - false, false, false, - new SchemaVariableModifierSet.TermSV()); + false, false, false, + new SchemaVariableModifierSet.TermSV()); b.setFind(tb.var(phi)); for (KeYParser.Datatype_constructorContext context : ctx.datatype_constructor()) { var func = functions().lookup(context.name.getText()); @@ -389,7 +399,8 @@ private RewriteTacletBuilder createConstructorSplit(KeYParser.Dat for (int i = 0; i < args.length; i++) { args[i] = variables.get(context.argName.get(i).getText()); } - Semisequent antec = new Semisequent(new SequentFormula(tb.equals(tb.var(phi), tb.func(func, args)))); + Semisequent antec = + new Semisequent(new SequentFormula(tb.equals(tb.var(phi), tb.func(func, args)))); Sequent addedSeq = Sequent.createAnteSequent(antec); TacletGoalTemplate goal = new TacletGoalTemplate(addedSeq, ImmutableSLList.nil()); goal.setName("#var = " + context.name.getText()); @@ -433,9 +444,9 @@ public Object visitVarexp(KeYParser.VarexpContext ctx) { String name = ctx.varexpId().getText(); List arguments = ctx.varexp_argument(); List suitableManipulators = - TacletBuilderManipulators.getConditionBuildersFor(name); + TacletBuilderManipulators.getConditionBuildersFor(name); List parameters = - ctx.parameter.stream().map(Token::getText).collect(Collectors.toList()); + ctx.parameter.stream().map(Token::getText).collect(Collectors.toList()); boolean applied = false; Object[] argCache = new Object[arguments.size()]; for (TacletBuilderCommand manipulator : suitableManipulators) { @@ -454,8 +465,8 @@ public Object visitVarexp(KeYParser.VarexpContext ctx) { } private boolean applyManipulator(boolean negated, Object[] args, - TacletBuilderCommand manipulator, List arguments, - List parameters) { + TacletBuilderCommand manipulator, List arguments, + List parameters) { assert args.length == arguments.size(); ArgumentType[] types = manipulator.getArgumentTypes(); @@ -474,24 +485,24 @@ private boolean applyManipulator(boolean negated, Object[] args, } private Object evaluateVarcondArgument(ArgumentType expectedType, Object prevValue, - KeYParser.Varexp_argumentContext ctx) { + KeYParser.Varexp_argumentContext ctx) { if (prevValue != null && expectedType.clazz.isAssignableFrom(prevValue.getClass())) { return prevValue; // previous value is of suitable type, we do not re-evaluate } switch (expectedType) { - case TYPE_RESOLVER: - return buildTypeResolver(ctx); - case SORT: + case TYPE_RESOLVER: + return buildTypeResolver(ctx); + case SORT: return visitSortId(ctx.term().getText(), ctx.term()); - case JAVA_TYPE: + case JAVA_TYPE: return getOrCreateJavaType(ctx.term().getText(), ctx); - case VARIABLE: - return varId(ctx, ctx.getText()); - case STRING: - return ctx.getText(); - case TERM: - return accept(ctx.term()); + case VARIABLE: + return varId(ctx, ctx.getText()); + case STRING: + return ctx.getText(); + case TERM: + return accept(ctx.term()); } assert false; return null; @@ -669,7 +680,7 @@ public ImmutableList visitTacletlist(KeYParser.TacletlistContext ctx) { @Nonnull private TacletBuilder createTacletBuilderFor(Object find, int applicationRestriction, - ParserRuleContext ctx) { + ParserRuleContext ctx) { if (find == null) { return new NoFindTacletBuilder(); } else if (find instanceof Term) { @@ -683,14 +694,14 @@ private TacletBuilder createTacletBuilderFor(Object find, int applicationRest AntecTacletBuilder b = new AntecTacletBuilder(); b.setFind(findFma); b.setIgnoreTopLevelUpdates( - (applicationRestriction & RewriteTaclet.IN_SEQUENT_STATE) == 0); + (applicationRestriction & RewriteTaclet.IN_SEQUENT_STATE) == 0); return b; } else if (findSeq.antecedent().size() == 0 && findSeq.succedent().size() == 1) { Term findFma = findSeq.succedent().get(0).formula(); SuccTacletBuilder b = new SuccTacletBuilder(); b.setFind(findFma); b.setIgnoreTopLevelUpdates( - (applicationRestriction & RewriteTaclet.IN_SEQUENT_STATE) == 0); + (applicationRestriction & RewriteTaclet.IN_SEQUENT_STATE) == 0); return b; } else { semanticError(ctx, "Unknown find-sequent (perhaps null?):" + findSeq); @@ -700,12 +711,12 @@ private TacletBuilder createTacletBuilderFor(Object find, int applicationRest } throw new IllegalArgumentException( - format("Could not find a suitable TacletBuilder for {0}", find)); + format("Could not find a suitable TacletBuilder for {0}", find)); } private void addGoalTemplate(String id, Object rwObj, Sequent addSeq, - ImmutableList addRList, ImmutableSet pvs, - @Nullable ChoiceExpr soc, ParserRuleContext ctx) { + ImmutableList addRList, ImmutableSet pvs, + @Nullable ChoiceExpr soc, ParserRuleContext ctx) { TacletBuilder b = peekTBuilder(); TacletGoalTemplate gt = null; if (rwObj == null) { @@ -720,7 +731,7 @@ private void addGoalTemplate(String id, Object rwObj, Sequent addSeq, gt = new AntecSuccTacletGoalTemplate(addSeq, addRList, (Sequent) rwObj, pvs); } else { semanticError(ctx, // new UnfittingReplacewithException - "Replacewith in a Antec-or SuccTaclet has to contain a sequent (not a term)"); + "Replacewith in a Antec-or SuccTaclet has to contain a sequent (not a term)"); } } else if (b instanceof RewriteTacletBuilder) { @@ -729,13 +740,13 @@ private void addGoalTemplate(String id, Object rwObj, Sequent addSeq, } else { // throwEx(/new UnfittingReplacewithException semanticError(ctx, - "Replacewith in a RewriteTaclet has to contain a term (not a sequent)"); + "Replacewith in a RewriteTaclet has to contain a term (not a sequent)"); } } } if (gt == null) { throw new NullPointerException( - "Could not find a suitable goal template builder for: " + b.getClass()); + "Could not find a suitable goal template builder for: " + b.getClass()); } gt.setName(id); b.addTacletGoalTemplate(gt); @@ -834,7 +845,7 @@ public Object visitOne_schema_var_decl(KeYParser.One_schema_var_declContext ctx) for (String id : ids) { declareSchemaVariable(ctx, id, s, makeVariableSV, makeSkolemTermSV, makeTermLabelSV, - mods); + mods); } return null; } @@ -846,7 +857,7 @@ public Object visitSchema_modifiers(KeYParser.Schema_modifiersContext ctx) { for (String id : ids) { if (!mods.addModifier(id)) { semanticError(ctx, - "Illegal or unknown modifier in declaration of schema variable: %s", id); + "Illegal or unknown modifier in declaration of schema variable: %s", id); } } return null; @@ -858,8 +869,8 @@ public Object visitSchema_var_decls(KeYParser.Schema_var_declsContext ctx) { } protected SchemaVariable declareSchemaVariable(ParserRuleContext ctx, String name, Sort s, - boolean makeVariableSV, boolean makeSkolemTermSV, boolean makeTermLabelSV, - SchemaVariableModifierSet mods) { + boolean makeVariableSV, boolean makeSkolemTermSV, boolean makeTermLabelSV, + SchemaVariableModifierSet mods) { SchemaVariable v; if (s == Sort.FORMULA && !makeSkolemTermSV) { v = SchemaVariableFactory.createFormulaSV(new Name(name), mods.rigid()); @@ -867,7 +878,7 @@ protected SchemaVariable declareSchemaVariable(ParserRuleContext ctx, String nam v = SchemaVariableFactory.createUpdateSV(new Name(name)); } else if (s instanceof ProgramSVSort) { v = SchemaVariableFactory.createProgramSV(new ProgramElementName(name), - (ProgramSVSort) s, mods.list()); + (ProgramSVSort) s, mods.list()); } else { if (makeVariableSV) { v = SchemaVariableFactory.createVariableSV(new Name(name), s); @@ -877,21 +888,21 @@ protected SchemaVariable declareSchemaVariable(ParserRuleContext ctx, String nam v = SchemaVariableFactory.createTermLabelSV(new Name(name)); } else { v = SchemaVariableFactory.createTermSV(new Name(name), s, mods.rigid(), - mods.strict()); + mods.strict()); } } if (variables().lookup(v.name()) != null) { semanticError(null, "Schema variables shadows previous declared variable: %s.", - v.name()); + v.name()); } if (schemaVariables().lookup(v.name()) != null) { SchemaVariable old = schemaVariables().lookup(v.name()); if (!old.sort().equals(v.sort())) { semanticError(null, - "Schema variables clashes with previous declared schema variable: %s.", - v.name()); + "Schema variables clashes with previous declared schema variable: %s.", + v.name()); } LOGGER.error("Override: {} {}", old, v); } diff --git a/key.core/src/main/java/de/uka/ilkd/key/proof/init/KeYUserProblemFile.java b/key.core/src/main/java/de/uka/ilkd/key/proof/init/KeYUserProblemFile.java index 1d4ab8e5aa..1ecb665ee0 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/proof/init/KeYUserProblemFile.java +++ b/key.core/src/main/java/de/uka/ilkd/key/proof/init/KeYUserProblemFile.java @@ -128,9 +128,10 @@ public void readProblem() throws ProofInputException { throw new IllegalStateException("KeYUserProblemFile: InitConfig not set."); } - readSorts(); - readFuncAndPred(); - readRules(); + // weigl: Not required already loaded in #read() + // readSorts(); + // readFuncAndPred(); + // readRules(); try { problemTerm = getProblemFinder().getProblemTerm(); From b4a650b039dce198827da960f8e079fc6034ea11 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Sat, 23 Sep 2023 18:09:14 +0200 Subject: [PATCH 06/66] add list example with two proofs --- .../proof/runallproofs/ProofCollections.java | 4 + .../standard_key/adt/dt_list_appnil.key | 64 ++++++++ .../standard_key/adt/dt_list_appnil.proof | 118 ++++++++++++++ .../standard_key/adt/dt_list_revrev.key | 79 ++++++++++ .../standard_key/adt/dt_list_revrev.proof | 148 ++++++++++++++++++ 5 files changed, 413 insertions(+) create mode 100644 key.ui/examples/standard_key/adt/dt_list_appnil.key create mode 100644 key.ui/examples/standard_key/adt/dt_list_appnil.proof create mode 100644 key.ui/examples/standard_key/adt/dt_list_revrev.key create mode 100644 key.ui/examples/standard_key/adt/dt_list_revrev.proof diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/ProofCollections.java b/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/ProofCollections.java index 9a7e0b81e8..73c2be09ee 100644 --- a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/ProofCollections.java +++ b/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/ProofCollections.java @@ -965,6 +965,10 @@ public static ProofCollection automaticJavaDL() throws IOException { g.provable("redux/arrays/ArrayCopy.arraycopy.exceptional.0.key"); g.provable("redux/arrays/ArrayCopy.arraycopy.exceptional.1.key"); + g = c.group("AlgebraicDatatypes"); + g.provable("standard_key/adt/dt_list.key"); + + return c; } diff --git a/key.ui/examples/standard_key/adt/dt_list_appnil.key b/key.ui/examples/standard_key/adt/dt_list_appnil.key new file mode 100644 index 0000000000..930a2c001f --- /dev/null +++ b/key.ui/examples/standard_key/adt/dt_list_appnil.key @@ -0,0 +1,64 @@ + +// In this example, the abstract data type list is defined. The ADT has +// the constructors "Nil" and "cons". The proof obligations states that +// a function "rev" really has the intended behaviour, namely to revert a +// list. To successfully finish the proof several lemmata have to be proven +// as subgoals (currently the lemmata have to be introduced by cuts): + +// 1. \forall List l1;\forall List l2;( rev(app(l1,l2))=app(rev(l2),rev(l1)) ) +// 2. \forall List l;( app(l,Nil)=l ) +// 3. \forall List l1;\forall List l2;\forall List l3;( app(l1,app(l2,l3))=app(app(l1,l2),l3) ) + +// This example is taken from an introduction to Isabelle/HOL. You can +// find the relevant pages describing the proof in file isabelleTutorial.ps.gz. +// Take a look at it if you get stuck in the proof. + + +\heuristicsDecl { + LIST; +} + +\datatypes { + List = Nil | Cons(any head, List tail); +} + +\predicates { + contains(any, List); +} + +\functions{ + // append to lists + List app(List, List); + // revert a list + List rev(List); +} + +\schemaVariables { + \term List list, list1; + \term any e; + \variables List nv; + \variables any el; + \formula b; +} + +\rules { + // axioms + concat_base{ + \find (app(Nil, list)) + \replacewith (list) + \heuristics (LIST) + }; + concat_step{ + \find( app(Cons(e, list1), list) ) + \replacewith (Cons(e, app(list1,list) )) + \heuristics (LIST)}; + + // definition of revert + revert_base {\find (rev(Nil)) \replacewith(Nil) }; + revert_step {\find (rev(Cons(e,list))) \replacewith (app(rev(list),Cons(e,Nil)))}; +} + +\problem { + \forall List l;( app(l,Nil)=l ) +} + diff --git a/key.ui/examples/standard_key/adt/dt_list_appnil.proof b/key.ui/examples/standard_key/adt/dt_list_appnil.proof new file mode 100644 index 0000000000..bb232ad61c --- /dev/null +++ b/key.ui/examples/standard_key/adt/dt_list_appnil.proof @@ -0,0 +1,118 @@ +\profile "Java Profile"; + +\settings { +"#Proof-Settings-Config-File +#Sat Sep 23 18:02:36 CEST 2023 +[Choice]DefaultChoices=JavaCard-JavaCard\\:off, Strings-Strings\\:on, assertions-assertions\\:safe, bigint-bigint\\:on, floatRules-floatRules\\:strictfpOnly, initialisation-initialisation\\:disableStaticInitialisation, intRules-intRules\\:arithmeticSemanticsIgnoringOF, integerSimplificationRules-integerSimplificationRules\\:full, javaLoopTreatment-javaLoopTreatment\\:efficient, mergeGenerateIsWeakeningGoal-mergeGenerateIsWeakeningGoal\\:off, methodExpansion-methodExpansion\\:modularOnly, modelFields-modelFields\\:treatAsAxiom, moreSeqRules-moreSeqRules\\:off, permissions-permissions\\:off, programRules-programRules\\:Java, reach-reach\\:on, runtimeExceptions-runtimeExceptions\\:ban, sequences-sequences\\:on, wdChecks-wdChecks\\:off, wdOperator-wdOperator\\:L +[Labels]UseOriginLabels=true +[SMTSettings]SelectedTaclets= +[SMTSettings]UseBuiltUniqueness=false +[SMTSettings]explicitTypeHierarchy=false +[SMTSettings]instantiateHierarchyAssumptions=true +[SMTSettings]integersMaximum=2147483645 +[SMTSettings]integersMinimum=-2147483645 +[SMTSettings]invariantForall=false +[SMTSettings]maxGenericSorts=2 +[SMTSettings]useConstantsForBigOrSmallIntegers=true +[SMTSettings]useUninterpretedMultiplication=true +[StrategyProperty]AUTO_INDUCTION_OPTIONS_KEY=AUTO_INDUCTION_OFF +[StrategyProperty]BLOCK_OPTIONS_KEY=BLOCK_CONTRACT_INTERNAL +[StrategyProperty]CLASS_AXIOM_OPTIONS_KEY=CLASS_AXIOM_FREE +[StrategyProperty]DEP_OPTIONS_KEY=DEP_ON +[StrategyProperty]INF_FLOW_CHECK_PROPERTY=INF_FLOW_CHECK_FALSE +[StrategyProperty]LOOP_OPTIONS_KEY=LOOP_SCOPE_INV_TACLET +[StrategyProperty]METHOD_OPTIONS_KEY=METHOD_CONTRACT +[StrategyProperty]MPS_OPTIONS_KEY=MPS_MERGE +[StrategyProperty]NON_LIN_ARITH_OPTIONS_KEY=NON_LIN_ARITH_NONE +[StrategyProperty]OSS_OPTIONS_KEY=OSS_ON +[StrategyProperty]QUANTIFIERS_OPTIONS_KEY=QUANTIFIERS_NON_SPLITTING_WITH_PROGS +[StrategyProperty]QUERYAXIOM_OPTIONS_KEY=QUERYAXIOM_ON +[StrategyProperty]QUERY_NEW_OPTIONS_KEY=QUERY_OFF +[StrategyProperty]SPLITTING_OPTIONS_KEY=SPLITTING_DELAYED +[StrategyProperty]STOPMODE_OPTIONS_KEY=STOPMODE_DEFAULT +[StrategyProperty]SYMBOLIC_EXECUTION_ALIAS_CHECK_OPTIONS_KEY=SYMBOLIC_EXECUTION_ALIAS_CHECK_NEVER +[StrategyProperty]SYMBOLIC_EXECUTION_NON_EXECUTION_BRANCH_HIDING_OPTIONS_KEY=SYMBOLIC_EXECUTION_NON_EXECUTION_BRANCH_HIDING_OFF +[StrategyProperty]USER_TACLETS_OPTIONS_KEY1=USER_TACLETS_OFF +[StrategyProperty]USER_TACLETS_OPTIONS_KEY2=USER_TACLETS_OFF +[StrategyProperty]USER_TACLETS_OPTIONS_KEY3=USER_TACLETS_OFF +[StrategyProperty]VBT_PHASE=VBT_SYM_EX +[Strategy]ActiveStrategy=JavaCardDLStrategy +[Strategy]MaximumNumberOfAutomaticApplications=500 +[Strategy]Timeout=-1 +" +} + +\heuristicsDecl { + LIST; +} + +\datatypes { + List = Nil | Cons(any head, List tail); +} + +\predicates { + contains(any, List); +} + +\functions{ + // append to lists + List app(List, List); + // revert a list + List rev(List); +} + +\schemaVariables { + \term List list, list1; + \term any e; + \variables List nv; + \variables any el; + \formula b; +} + +\rules { + // axioms + concat_base{ + \find (app(Nil, list)) + \replacewith (list) + \heuristics (LIST) + }; + concat_step{ + \find( app(Cons(e, list1), list) ) + \replacewith (Cons(e, app(list1,list) )) + \heuristics (LIST)}; + + // definition of revert + revert_base {\find (rev(Nil)) \replacewith(Nil) }; + revert_step {\find (rev(Cons(e,list))) \replacewith (app(rev(list),Cons(e,Nil)))}; +} +\problem { +\forall List l; app(l, Nil) = l +} + +\proof { +(keyLog "0" (keyUser "weigl" ) (keyVersion "a2d4fe7cbe94d8423abafb4759831fd75cadc21f")) + +(autoModeTime "105") + +(branch "dummy ID" +(rule "List_Ind" (inst "phi=(app(l, Nil) = l)<>") (inst "x=l") (userinteraction)) +(branch "Nil" + (rule "concat_base" (formula "1") (term "0") (userinteraction)) + (builtin "One Step Simplification" (formula "1")) + (rule "closeTrue" (formula "1")) +) +(branch "Cons(anyhead,Listtail)" + (rule "allRight" (formula "2") (inst "sk=l_0")) + (rule "allRight" (formula "1") (inst "sk=tail_0")) + (rule "allRight" (formula "1") (inst "sk=head_0")) + (rule "impRight" (formula "1")) + (rule "concat_step" (formula "2") (term "0")) + (rule "applyEq" (formula "2") (term "1,0") (ifseqformula "1")) + (builtin "One Step Simplification" (formula "2")) + (rule "closeTrue" (formula "2")) +) +(branch "Use case of List" + (rule "close" (formula "2") (ifseqformula "1")) +) +) +} diff --git a/key.ui/examples/standard_key/adt/dt_list_revrev.key b/key.ui/examples/standard_key/adt/dt_list_revrev.key new file mode 100644 index 0000000000..200b477a28 --- /dev/null +++ b/key.ui/examples/standard_key/adt/dt_list_revrev.key @@ -0,0 +1,79 @@ + +// In this example, the abstract data type list is defined. The ADT has +// the constructors "Nil" and "cons". The proof obligations states that +// a function "rev" really has the intended behaviour, namely to revert a +// list. To successfully finish the proof several lemmata have to be proven +// as subgoals (currently the lemmata have to be introduced by cuts): + +// 1. \forall List l1;\forall List l2;( rev(app(l1,l2))=app(rev(l2),rev(l1)) ) +// 2. \forall List l;( app(l,Nil)=l ) +// 3. \forall List l1;\forall List l2;\forall List l3;( app(l1,app(l2,l3))=app(app(l1,l2),l3) ) + +// This example is taken from an introduction to Isabelle/HOL. You can +// find the relevant pages describing the proof in file isabelleTutorial.ps.gz. +// Take a look at it if you get stuck in the proof. + + +\heuristicsDecl { + LIST; +} + +\datatypes { + List = Nil | Cons(any head, List tail); +} + +\predicates { + contains(any, List); +} + +\functions{ + // append to lists + List app(List, List); + // revert a list + List rev(List); +} + +\schemaVariables { + \term List list, list1; + \term any e; + \variables List nv; + \variables any el; + \formula b; +} + +\rules { + // axioms + concat_base{ + \find (app(Nil, list)) + \replacewith (list) + \heuristics (LIST) + }; + concat_step{ + \find( app(Cons(e, list1), list) ) + \replacewith (Cons(e, app(list1,list) )) + \heuristics (LIST)}; + + // definition of revert + revert_base {\find (rev(Nil)) \replacewith(Nil) }; + revert_step {\find (rev(Cons(e,list))) \replacewith (app(rev(list),Cons(e,Nil)))}; + + // we need a rule for structural induction on lists + // WATCHOUT: Woj: I modified this rule, only schema variables should be allowed here + /*structuralInduction_on_lists { + \varcond(\notFreeIn(el,b)) + \add ( ==> {\subst nv; Nil}(b) ); + \add ( ==> \forall el; \forall nv; (b->{\subst nv; Cons(el,nv)}b) ); + \add ( \forall nv; b ==>)}; + */ +} + +\axioms { + \lemma lemma1 { \forall List l1;\forall List l2;( rev(app(l1,l2))=app(rev(l2),rev(l1)) ) }; + \lemma lemma2 { \forall List l;( app(l,Nil)=l ) }; + \lemma lemma3 { \forall List l1;\forall List l2;\forall List l3;( app(l1,app(l2,l3))=app(app(l1,l2),l3) ) }; +} + +\problem { + \forall List l; rev(rev(l))=l +} + diff --git a/key.ui/examples/standard_key/adt/dt_list_revrev.proof b/key.ui/examples/standard_key/adt/dt_list_revrev.proof new file mode 100644 index 0000000000..f081a3e966 --- /dev/null +++ b/key.ui/examples/standard_key/adt/dt_list_revrev.proof @@ -0,0 +1,148 @@ +\profile "Java Profile"; + +\settings { +"#Proof-Settings-Config-File +#Sat Sep 23 17:58:44 CEST 2023 +[Choice]DefaultChoices=JavaCard-JavaCard\\:off, Strings-Strings\\:on, assertions-assertions\\:safe, bigint-bigint\\:on, floatRules-floatRules\\:strictfpOnly, initialisation-initialisation\\:disableStaticInitialisation, intRules-intRules\\:arithmeticSemanticsIgnoringOF, integerSimplificationRules-integerSimplificationRules\\:full, javaLoopTreatment-javaLoopTreatment\\:efficient, mergeGenerateIsWeakeningGoal-mergeGenerateIsWeakeningGoal\\:off, methodExpansion-methodExpansion\\:modularOnly, modelFields-modelFields\\:treatAsAxiom, moreSeqRules-moreSeqRules\\:off, permissions-permissions\\:off, programRules-programRules\\:Java, reach-reach\\:on, runtimeExceptions-runtimeExceptions\\:ban, sequences-sequences\\:on, wdChecks-wdChecks\\:off, wdOperator-wdOperator\\:L +[Labels]UseOriginLabels=true +[SMTSettings]SelectedTaclets= +[SMTSettings]UseBuiltUniqueness=false +[SMTSettings]explicitTypeHierarchy=false +[SMTSettings]instantiateHierarchyAssumptions=true +[SMTSettings]integersMaximum=2147483645 +[SMTSettings]integersMinimum=-2147483645 +[SMTSettings]invariantForall=false +[SMTSettings]maxGenericSorts=2 +[SMTSettings]useConstantsForBigOrSmallIntegers=true +[SMTSettings]useUninterpretedMultiplication=true +[StrategyProperty]AUTO_INDUCTION_OPTIONS_KEY=AUTO_INDUCTION_OFF +[StrategyProperty]BLOCK_OPTIONS_KEY=BLOCK_CONTRACT_INTERNAL +[StrategyProperty]CLASS_AXIOM_OPTIONS_KEY=CLASS_AXIOM_FREE +[StrategyProperty]DEP_OPTIONS_KEY=DEP_ON +[StrategyProperty]INF_FLOW_CHECK_PROPERTY=INF_FLOW_CHECK_FALSE +[StrategyProperty]LOOP_OPTIONS_KEY=LOOP_SCOPE_INV_TACLET +[StrategyProperty]METHOD_OPTIONS_KEY=METHOD_CONTRACT +[StrategyProperty]MPS_OPTIONS_KEY=MPS_MERGE +[StrategyProperty]NON_LIN_ARITH_OPTIONS_KEY=NON_LIN_ARITH_NONE +[StrategyProperty]OSS_OPTIONS_KEY=OSS_ON +[StrategyProperty]QUANTIFIERS_OPTIONS_KEY=QUANTIFIERS_NON_SPLITTING_WITH_PROGS +[StrategyProperty]QUERYAXIOM_OPTIONS_KEY=QUERYAXIOM_ON +[StrategyProperty]QUERY_NEW_OPTIONS_KEY=QUERY_OFF +[StrategyProperty]SPLITTING_OPTIONS_KEY=SPLITTING_DELAYED +[StrategyProperty]STOPMODE_OPTIONS_KEY=STOPMODE_DEFAULT +[StrategyProperty]SYMBOLIC_EXECUTION_ALIAS_CHECK_OPTIONS_KEY=SYMBOLIC_EXECUTION_ALIAS_CHECK_NEVER +[StrategyProperty]SYMBOLIC_EXECUTION_NON_EXECUTION_BRANCH_HIDING_OPTIONS_KEY=SYMBOLIC_EXECUTION_NON_EXECUTION_BRANCH_HIDING_OFF +[StrategyProperty]USER_TACLETS_OPTIONS_KEY1=USER_TACLETS_OFF +[StrategyProperty]USER_TACLETS_OPTIONS_KEY2=USER_TACLETS_OFF +[StrategyProperty]USER_TACLETS_OPTIONS_KEY3=USER_TACLETS_OFF +[StrategyProperty]VBT_PHASE=VBT_SYM_EX +[Strategy]ActiveStrategy=JavaCardDLStrategy +[Strategy]MaximumNumberOfAutomaticApplications=500 +[Strategy]Timeout=-1 +" +} + +\heuristicsDecl { + LIST; +} + +\datatypes { + List = Nil | Cons(any head, List tail); +} + +\predicates { + contains(any, List); +} + +\functions{ + // append to lists + List app(List, List); + // revert a list + List rev(List); +} + +\schemaVariables { + \term List list, list1; + \term any e; + \variables List nv; + \variables any el; + \formula b; +} + +\rules { + // axioms + concat_base{ + \find (app(Nil, list)) + \replacewith (list) + \heuristics (LIST) + }; + concat_step{ + \find( app(Cons(e, list1), list) ) + \replacewith (Cons(e, app(list1,list) )) + \heuristics (LIST)}; + + // definition of revert + revert_base {\find (rev(Nil)) \replacewith(Nil) }; + revert_step {\find (rev(Cons(e,list))) \replacewith (app(rev(list),Cons(e,Nil)))}; + + // we need a rule for structural induction on lists + // WATCHOUT: Woj: I modified this rule, only schema variables should be allowed here + /*structuralInduction_on_lists { + \varcond(\notFreeIn(el,b)) + \add ( ==> {\subst nv; Nil}(b) ); + \add ( ==> \forall el; \forall nv; (b->{\subst nv; Cons(el,nv)}b) ); + \add ( \forall nv; b ==>)}; + */ +} + +\axioms { + \lemma lemma1 { \forall List l1;\forall List l2;( rev(app(l1,l2))=app(rev(l2),rev(l1)) ) }; + \lemma lemma2 { \forall List l;( app(l,Nil)=l ) }; + \lemma lemma3 { \forall List l1;\forall List l2;\forall List l3;( app(l1,app(l2,l3))=app(app(l1,l2),l3) ) }; +} +\problem { +\forall List l; rev(rev(l)) = l +} + +\proof { +(keyLog "0" (keyUser "weigl" ) (keyVersion "a2d4fe7cbe94d8423abafb4759831fd75cadc21f")) + +(autoModeTime "22638") + +(branch "dummy ID" +(rule "List_Ind" (inst "phi=(rev(rev(l)) = l)<>") (inst "x=l") (userinteraction)) +(branch "Nil" + (rule "allRight" (formula "2") (inst "sk=l_0")) + (rule "revert_base" (formula "1") (term "0,0") (userinteraction)) + (rule "revert_base" (formula "1") (term "0") (userinteraction)) + (builtin "One Step Simplification" (formula "1")) + (rule "closeTrue" (formula "1")) +) +(branch "Cons(anyhead,Listtail)" + (rule "allRight" (formula "1") (inst "sk=tail_0") (userinteraction)) + (rule "allRight" (formula "1") (inst "sk=head_0") (userinteraction)) + (rule "hide_right" (formula "2") (userinteraction)) + (rule "impRight" (formula "1") (userinteraction)) + (rule "lemma1" (userinteraction)) + (rule "lemma2" (userinteraction)) + (rule "lemma3" (userinteraction)) + (rule "revert_step" (formula "5") (term "0,0") (userinteraction)) + (rule "instAll" (formula "5") (term "0,0,0") (ifseqformula "3") (userinteraction)) + (rule "instAll" (formula "6") (term "1,0,0") (ifseqformula "1") (userinteraction)) + (rule "applyEqRigid" (formula "7") (term "0") (ifseqformula "1") (userinteraction)) + (rule "applyEqRigid" (formula "7") (term "1,0") (ifseqformula "6") (userinteraction)) + (rule "hide_left" (formula "1") (userinteraction)) + (rule "hide_left" (formula "1") (userinteraction)) + (rule "revert_step" (formula "5") (term "0,0") (userinteraction)) + (rule "revert_base" (formula "5") (term "0,0,0") (userinteraction)) + (rule "concat_base" (formula "5") (term "0,0") (userinteraction)) + (rule "concat_step" (formula "5") (term "0") (userinteraction)) + (rule "concat_base" (formula "5") (term "1,0") (userinteraction)) + (builtin "One Step Simplification" (formula "5")) + (rule "closeTrue" (formula "5")) +) +(branch "Use case of List" + (rule "close" (formula "2") (ifseqformula "1")) +) +) +} From c4341591f14105ad77212307e9c4343c534bac8d Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Sun, 24 Sep 2023 16:28:01 +0200 Subject: [PATCH 07/66] add an example for case distinction --- .../proof/runallproofs/ProofCollections.java | 5 +- key.ui/examples/standard_key/adt/dt_color.key | 8 ++ .../examples/standard_key/adt/dt_color.proof | 75 +++++++++++++++++++ 3 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 key.ui/examples/standard_key/adt/dt_color.key create mode 100644 key.ui/examples/standard_key/adt/dt_color.proof diff --git a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/ProofCollections.java b/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/ProofCollections.java index 73c2be09ee..a6cb9db1f8 100644 --- a/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/ProofCollections.java +++ b/key.core/src/test/java/de/uka/ilkd/key/proof/runallproofs/ProofCollections.java @@ -966,8 +966,9 @@ public static ProofCollection automaticJavaDL() throws IOException { g.provable("redux/arrays/ArrayCopy.arraycopy.exceptional.1.key"); g = c.group("AlgebraicDatatypes"); - g.provable("standard_key/adt/dt_list.key"); - + g.loadable("standard_key/adt/dt_list_revrev.proof"); + g.loadable("standard_key/adt/dt_list_appnil.proof"); + g.loadable("standard_key/adt/dt_color.proof"); return c; } diff --git a/key.ui/examples/standard_key/adt/dt_color.key b/key.ui/examples/standard_key/adt/dt_color.key new file mode 100644 index 0000000000..c17c6f783c --- /dev/null +++ b/key.ui/examples/standard_key/adt/dt_color.key @@ -0,0 +1,8 @@ +\datatypes { + Color = Red | Green | Blue; +} + +\problem { + \forall Color l; ( l = Red | l = Green | l = Blue) +} + diff --git a/key.ui/examples/standard_key/adt/dt_color.proof b/key.ui/examples/standard_key/adt/dt_color.proof new file mode 100644 index 0000000000..3bbc095c02 --- /dev/null +++ b/key.ui/examples/standard_key/adt/dt_color.proof @@ -0,0 +1,75 @@ +\profile "Java Profile"; + +\settings { +"#Proof-Settings-Config-File +#Sat Sep 23 18:17:13 CEST 2023 +[Choice]DefaultChoices=JavaCard-JavaCard\\:off, Strings-Strings\\:on, assertions-assertions\\:safe, bigint-bigint\\:on, floatRules-floatRules\\:strictfpOnly, initialisation-initialisation\\:disableStaticInitialisation, intRules-intRules\\:arithmeticSemanticsIgnoringOF, integerSimplificationRules-integerSimplificationRules\\:full, javaLoopTreatment-javaLoopTreatment\\:efficient, mergeGenerateIsWeakeningGoal-mergeGenerateIsWeakeningGoal\\:off, methodExpansion-methodExpansion\\:modularOnly, modelFields-modelFields\\:treatAsAxiom, moreSeqRules-moreSeqRules\\:off, permissions-permissions\\:off, programRules-programRules\\:Java, reach-reach\\:on, runtimeExceptions-runtimeExceptions\\:ban, sequences-sequences\\:on, wdChecks-wdChecks\\:off, wdOperator-wdOperator\\:L +[Labels]UseOriginLabels=true +[SMTSettings]SelectedTaclets= +[SMTSettings]UseBuiltUniqueness=false +[SMTSettings]explicitTypeHierarchy=false +[SMTSettings]instantiateHierarchyAssumptions=true +[SMTSettings]integersMaximum=2147483645 +[SMTSettings]integersMinimum=-2147483645 +[SMTSettings]invariantForall=false +[SMTSettings]maxGenericSorts=2 +[SMTSettings]useConstantsForBigOrSmallIntegers=true +[SMTSettings]useUninterpretedMultiplication=true +[StrategyProperty]AUTO_INDUCTION_OPTIONS_KEY=AUTO_INDUCTION_OFF +[StrategyProperty]BLOCK_OPTIONS_KEY=BLOCK_CONTRACT_INTERNAL +[StrategyProperty]CLASS_AXIOM_OPTIONS_KEY=CLASS_AXIOM_FREE +[StrategyProperty]DEP_OPTIONS_KEY=DEP_ON +[StrategyProperty]INF_FLOW_CHECK_PROPERTY=INF_FLOW_CHECK_FALSE +[StrategyProperty]LOOP_OPTIONS_KEY=LOOP_SCOPE_INV_TACLET +[StrategyProperty]METHOD_OPTIONS_KEY=METHOD_CONTRACT +[StrategyProperty]MPS_OPTIONS_KEY=MPS_MERGE +[StrategyProperty]NON_LIN_ARITH_OPTIONS_KEY=NON_LIN_ARITH_NONE +[StrategyProperty]OSS_OPTIONS_KEY=OSS_ON +[StrategyProperty]QUANTIFIERS_OPTIONS_KEY=QUANTIFIERS_NON_SPLITTING_WITH_PROGS +[StrategyProperty]QUERYAXIOM_OPTIONS_KEY=QUERYAXIOM_ON +[StrategyProperty]QUERY_NEW_OPTIONS_KEY=QUERY_OFF +[StrategyProperty]SPLITTING_OPTIONS_KEY=SPLITTING_DELAYED +[StrategyProperty]STOPMODE_OPTIONS_KEY=STOPMODE_DEFAULT +[StrategyProperty]SYMBOLIC_EXECUTION_ALIAS_CHECK_OPTIONS_KEY=SYMBOLIC_EXECUTION_ALIAS_CHECK_NEVER +[StrategyProperty]SYMBOLIC_EXECUTION_NON_EXECUTION_BRANCH_HIDING_OPTIONS_KEY=SYMBOLIC_EXECUTION_NON_EXECUTION_BRANCH_HIDING_OFF +[StrategyProperty]USER_TACLETS_OPTIONS_KEY1=USER_TACLETS_OFF +[StrategyProperty]USER_TACLETS_OPTIONS_KEY2=USER_TACLETS_OFF +[StrategyProperty]USER_TACLETS_OPTIONS_KEY3=USER_TACLETS_OFF +[StrategyProperty]VBT_PHASE=VBT_SYM_EX +[Strategy]ActiveStrategy=JavaCardDLStrategy +[Strategy]MaximumNumberOfAutomaticApplications=500 +[Strategy]Timeout=-1 +" +} + +\datatypes { + Color = Red | Green | Blue; +} +\problem { +\forall Color l; (l = Red | l = Green | l = Blue) +} + +\proof { +(keyLog "0" (keyUser "weigl" ) (keyVersion "a2d4fe7cbe94d8423abafb4759831fd75cadc21f")) + +(autoModeTime "81") + +(branch "dummy ID" +(rule "allRight" (formula "1") (inst "sk=l_0") (userinteraction)) +(rule "Color_ctor_split" (formula "1") (term "0,0,0") (userinteraction)) +(branch "l_0 = Red" + (rule "orRight" (formula "2")) + (rule "orRight" (formula "2")) + (rule "close" (formula "2") (ifseqformula "1")) +) +(branch "l_0 = Green" + (rule "orRight" (formula "2")) + (rule "orRight" (formula "2")) + (rule "close" (formula "3") (ifseqformula "1")) +) +(branch "l_0 = Blue" + (rule "orRight" (formula "2")) + (rule "close" (formula "3") (ifseqformula "1")) +) +) +} From 3b81b96721cefa2919ff4ebe839433cd586c5d88 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Tue, 26 Sep 2023 22:53:28 +0200 Subject: [PATCH 08/66] fix spaces in origin label manually + spotless --- .../java/de/uka/ilkd/key/nparser/builder/TacletPBuilder.java | 1 - key.ui/examples/standard_key/adt/dt_list_appnil.proof | 2 +- key.ui/examples/standard_key/adt/dt_list_revrev.proof | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) 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 658f380737..30663bbc82 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 @@ -29,7 +29,6 @@ import de.uka.ilkd.key.rule.conditions.TypeResolver; import de.uka.ilkd.key.rule.tacletbuilder.*; import de.uka.ilkd.key.util.Pair; -import de.uka.ilkd.key.settings.AbstractPropertiesSettings; import de.uka.ilkd.key.util.parsing.BuildingException; import org.key_project.util.collection.DefaultImmutableSet; diff --git a/key.ui/examples/standard_key/adt/dt_list_appnil.proof b/key.ui/examples/standard_key/adt/dt_list_appnil.proof index bb232ad61c..0769c9f8f6 100644 --- a/key.ui/examples/standard_key/adt/dt_list_appnil.proof +++ b/key.ui/examples/standard_key/adt/dt_list_appnil.proof @@ -95,7 +95,7 @@ (autoModeTime "105") (branch "dummy ID" -(rule "List_Ind" (inst "phi=(app(l, Nil) = l)<>") (inst "x=l") (userinteraction)) +(rule "List_Ind" (inst "phi=(app(l, Nil) = l)<>") (inst "x=l") (userinteraction)) (branch "Nil" (rule "concat_base" (formula "1") (term "0") (userinteraction)) (builtin "One Step Simplification" (formula "1")) diff --git a/key.ui/examples/standard_key/adt/dt_list_revrev.proof b/key.ui/examples/standard_key/adt/dt_list_revrev.proof index f081a3e966..c7b1de5451 100644 --- a/key.ui/examples/standard_key/adt/dt_list_revrev.proof +++ b/key.ui/examples/standard_key/adt/dt_list_revrev.proof @@ -110,7 +110,7 @@ (autoModeTime "22638") (branch "dummy ID" -(rule "List_Ind" (inst "phi=(rev(rev(l)) = l)<>") (inst "x=l") (userinteraction)) +(rule "List_Ind" (inst "phi=(rev(rev(l)) = l)<>") (inst "x=l") (userinteraction)) (branch "Nil" (rule "allRight" (formula "2") (inst "sk=l_0")) (rule "revert_base" (formula "1") (term "0,0") (userinteraction)) From d1d178c71879fccbf5f7980528d4e99a981d4e81 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Thu, 28 Sep 2023 13:56:39 +0200 Subject: [PATCH 09/66] no spaces in displaynames of taclets * little bit of clean up (Java 17) --- .../key/nparser/builder/TacletPBuilder.java | 79 +++++++------------ 1 file changed, 29 insertions(+), 50 deletions(-) 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 30663bbc82..e1abbb9325 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 @@ -3,11 +3,7 @@ * SPDX-License-Identifier: GPL-2.0-only */ package de.uka.ilkd.key.nparser.builder; -import java.util.*; -import java.util.stream.Collectors; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - +import antlr.RecognitionException; import de.uka.ilkd.key.java.Services; import de.uka.ilkd.key.java.abstraction.KeYJavaType; import de.uka.ilkd.key.java.abstraction.PrimitiveType; @@ -22,27 +18,26 @@ import de.uka.ilkd.key.nparser.varexp.TacletBuilderCommand; import de.uka.ilkd.key.nparser.varexp.TacletBuilderManipulators; import de.uka.ilkd.key.parser.SchemaVariableModifierSet; -import de.uka.ilkd.key.pp.LogicPrinter; -import de.uka.ilkd.key.pp.NotationInfo; -import de.uka.ilkd.key.pp.PosTableLayouter; import de.uka.ilkd.key.rule.*; import de.uka.ilkd.key.rule.conditions.TypeResolver; import de.uka.ilkd.key.rule.tacletbuilder.*; import de.uka.ilkd.key.util.Pair; import de.uka.ilkd.key.util.parsing.BuildingException; - +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.RuleContext; +import org.antlr.v4.runtime.Token; import org.key_project.util.collection.DefaultImmutableSet; import org.key_project.util.collection.ImmutableList; import org.key_project.util.collection.ImmutableSLList; import org.key_project.util.collection.ImmutableSet; - -import antlr.RecognitionException; -import org.antlr.v4.runtime.ParserRuleContext; -import org.antlr.v4.runtime.RuleContext; -import org.antlr.v4.runtime.Token; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.*; +import java.util.stream.Collectors; + import static java.text.MessageFormat.format; public class TacletPBuilder extends ExpressionBuilder { @@ -95,11 +90,7 @@ public Object visitRulesOrAxioms(KeYParser.RulesOrAxiomsContext ctx) { axiomMode = true; } ChoiceExpr choices = accept(ctx.choices); - if (choices != null) { - this.requiredChoices = choices; - } else { - this.requiredChoices = ChoiceExpr.TRUE; - } + this.requiredChoices = Objects.requireNonNullElse(choices, ChoiceExpr.TRUE); List seq = mapOf(ctx.taclet()); topLevelTaclets.addAll(seq); disableJavaSchemaMode(); @@ -119,8 +110,7 @@ public Object visitOne_schema_modal_op_decl(KeYParser.One_schema_modal_op_declCo for (String s : Objects.requireNonNull(ids)) { modalities = opSVHelper(s, modalities); } - SchemaVariable osv = schemaVariables().lookup(new Name(id)); - osv = SchemaVariableFactory.createModalOperatorSV(new Name(id), sort, modalities); + SchemaVariable osv = SchemaVariableFactory.createModalOperatorSV(new Name(id), sort, modalities); schemaVariables().add(osv); return osv; } @@ -221,14 +211,11 @@ public Taclet visitTaclet(KeYParser.TacletContext ctx) { } private void registerTaclet(KeYParser.Datatype_declContext ctx, TacletBuilder tb) { - LogicPrinter lp = - new LogicPrinter(new NotationInfo(), services, new PosTableLayouter(100, 4, true)); var taclet = tb.getTaclet(); taclet2Builder.put(taclet, peekTBuilder()); topLevelTaclets.add(taclet); LOGGER.trace("Taclet announced: \"{}\" from {}:{}", taclet.name(), ctx.start.getTokenSource().getSourceName(), ctx.start.getLine()); - System.out.println(lp.result()); } private void registerTaclet(ParserRuleContext ctx, Taclet taclet) { @@ -282,7 +269,7 @@ private TacletBuilder createInductionTaclet( cases.add(useCase); cases.forEach(tacletBuilder::addTacletGoalTemplate); - tacletBuilder.setDisplayName("Induction for " + sort.name()); + tacletBuilder.setDisplayName("Induction_for_" + sort.name()); return tacletBuilder; } @@ -323,7 +310,7 @@ private RewriteTacletBuilder createAxiomTaclet( ImmutableSLList.nil()); tacletBuilder.addTacletGoalTemplate(goal); - tacletBuilder.setDisplayName("Axiom for " + sort.name()); + tacletBuilder.setDisplayName("Axiom_for_" + sort.name()); return tacletBuilder; } @@ -331,7 +318,7 @@ private Term createQuantifiedFormula(KeYParser.Datatype_constructorContext conte QuantifiableVariable qvX, Term phi, Sort dt) { var tb = services.getTermBuilder(); var fn = functions().lookup(context.name.getText()); - if (context.argName.size() == 0) + if (context.argName.isEmpty()) return tb.subst(qvX, tb.func(fn), phi); var args = new Term[context.argName.size()]; @@ -339,11 +326,11 @@ private Term createQuantifiedFormula(KeYParser.Datatype_constructorContext conte var argSort = context.argSort.stream() .map(it -> sorts().lookup(it.getText())) - .collect(Collectors.toList()); + .toList(); var argNames = context.argName.stream() .map(RuleContext::getText) - .collect(Collectors.toList()); + .toList(); var qvs = new ArrayList(args.length); var ind = new ArrayList(args.length); @@ -489,22 +476,14 @@ private Object evaluateVarcondArgument(ArgumentType expectedType, Object prevVal return prevValue; // previous value is of suitable type, we do not re-evaluate } - switch (expectedType) { - case TYPE_RESOLVER: - return buildTypeResolver(ctx); - case SORT: - return visitSortId(ctx.term().getText(), ctx.term()); - case JAVA_TYPE: - return getOrCreateJavaType(ctx.term().getText(), ctx); - case VARIABLE: - return varId(ctx, ctx.getText()); - case STRING: - return ctx.getText(); - case TERM: - return accept(ctx.term()); - } - assert false; - return null; + return switch (expectedType) { + case TYPE_RESOLVER -> buildTypeResolver(ctx); + case SORT -> visitSortId(ctx.term().getText(), ctx.term()); + case JAVA_TYPE -> getOrCreateJavaType(ctx.term().getText(), ctx); + case VARIABLE -> varId(ctx, ctx.getText()); + case STRING -> ctx.getText(); + case TERM -> accept(ctx.term()); + }; } private Sort visitSortId(String text, ParserRuleContext ctx) { @@ -546,7 +525,7 @@ private KeYJavaType getOrCreateJavaType(String sortId, ParserRuleContext ctx) { if (t != null) { return t; } - return new KeYJavaType((Sort) visitSortId(sortId, ctx)); + return new KeYJavaType(visitSortId(sortId, ctx)); } @@ -683,19 +662,19 @@ private TacletBuilder createTacletBuilderFor(Object find, int applicationRest if (find == null) { return new NoFindTacletBuilder(); } else if (find instanceof Term) { - return new RewriteTacletBuilder().setFind((Term) find) + return new RewriteTacletBuilder<>().setFind((Term) find) .setApplicationRestriction(applicationRestriction); } else if (find instanceof Sequent findSeq) { if (findSeq.isEmpty()) { return new NoFindTacletBuilder(); - } else if (findSeq.antecedent().size() == 1 && findSeq.succedent().size() == 0) { + } else if (findSeq.antecedent().size() == 1 && findSeq.succedent().isEmpty()) { Term findFma = findSeq.antecedent().get(0).formula(); AntecTacletBuilder b = new AntecTacletBuilder(); b.setFind(findFma); b.setIgnoreTopLevelUpdates( (applicationRestriction & RewriteTaclet.IN_SEQUENT_STATE) == 0); return b; - } else if (findSeq.antecedent().size() == 0 && findSeq.succedent().size() == 1) { + } else if (findSeq.antecedent().isEmpty() && findSeq.succedent().size() == 1) { Term findFma = findSeq.succedent().get(0).formula(); SuccTacletBuilder b = new SuccTacletBuilder(); b.setFind(findFma); @@ -842,7 +821,7 @@ public Object visitOne_schema_var_decl(KeYParser.One_schema_var_declContext ctx) s = accept(ctx.sortId()); } - for (String id : ids) { + for (String id : Objects.requireNonNull(ids)) { declareSchemaVariable(ctx, id, s, makeVariableSV, makeSkolemTermSV, makeTermLabelSV, mods); } From a6af031923b8d31baae6df08ec761ad93a8248a8 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Tue, 17 Oct 2023 16:11:57 +0200 Subject: [PATCH 10/66] fix passing of warnings --- .../java/de/uka/ilkd/key/nparser/KeyIO.java | 14 +++-- .../builder/FunctionPredicateBuilder.java | 2 +- .../key/proof/init/KeYUserProblemFile.java | 2 +- .../de/uka/ilkd/key/proof/io/KeYFile.java | 19 ++++--- .../de/uka/ilkd/key/proof/io/LDTInput.java | 14 +++-- .../ilkd/key/util/parsing/BuildingIssue.java | 51 +++++++++++++++---- 6 files changed, 74 insertions(+), 28 deletions(-) diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/KeyIO.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/KeyIO.java index a7eadc171c..c80530991b 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/KeyIO.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/KeyIO.java @@ -51,8 +51,7 @@ public class KeyIO { private final NamespaceSet nss; @Nullable private Namespace schemaNamespace; - @Nullable - private List warnings; + private List warnings = new LinkedList<>(); private AbbrevMap abbrevMap; @@ -166,23 +165,29 @@ public Loader load(URL u) { public List findTaclets(KeyAst.File ctx) { TacletPBuilder visitor = new TacletPBuilder(services, nss); ctx.accept(visitor); + warnings.addAll(visitor.getBuildingIssues()); return visitor.getTopLevelTaclets(); } /** * @param ctx + * @return */ - public void evalDeclarations(KeyAst.File ctx) { + public List evalDeclarations(KeyAst.File ctx) { DeclarationBuilder declBuilder = new DeclarationBuilder(services, nss); ctx.accept(declBuilder); + warnings.addAll(declBuilder.getBuildingIssues()); + return declBuilder.getBuildingIssues(); } /** * @param ctx */ - public void evalFuncAndPred(KeyAst.File ctx) { + public List evalFuncAndPred(KeyAst.File ctx) { FunctionPredicateBuilder visitor = new FunctionPredicateBuilder(services, nss); ctx.accept(visitor); + warnings.addAll(visitor.getBuildingIssues()); + return visitor.getBuildingIssues(); } @@ -198,7 +203,6 @@ public AbbrevMap getAbbrevMap() { return abbrevMap; } - @Nullable public List getWarnings() { return warnings; } diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java index 4792916542..a5f404cc4a 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java @@ -116,7 +116,7 @@ public Object visitFunc_decl(KeYParser.Func_declContext ctx) { if (lookup(f.name()) == null) { functions().add(f); } else { - addWarning("Function '" + func_name + "' is already defined!"); + addWarning(ctx, "Function '" + func_name + "' is already defined!"); } return f; } diff --git a/key.core/src/main/java/de/uka/ilkd/key/proof/init/KeYUserProblemFile.java b/key.core/src/main/java/de/uka/ilkd/key/proof/init/KeYUserProblemFile.java index 455491c16f..f7a4178b70 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/proof/init/KeYUserProblemFile.java +++ b/key.core/src/main/java/de/uka/ilkd/key/proof/init/KeYUserProblemFile.java @@ -105,7 +105,7 @@ public ImmutableSet read() throws ProofInputException { ImmutableSet warnings = DefaultImmutableSet.nil(); // read key file itself (except contracts) - super.readExtendedSignature(); + warnings = warnings.union(super.readExtendedSignature()); // read in-code specifications SLEnvInput slEnvInput = new SLEnvInput(readJavaPath(), readClassPath(), readBootClassPath(), diff --git a/key.core/src/main/java/de/uka/ilkd/key/proof/io/KeYFile.java b/key.core/src/main/java/de/uka/ilkd/key/proof/io/KeYFile.java index 982950e233..2c48978bb4 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/proof/io/KeYFile.java +++ b/key.core/src/main/java/de/uka/ilkd/key/proof/io/KeYFile.java @@ -11,6 +11,7 @@ import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -315,10 +316,11 @@ public ImmutableSet readExtendedSignature() { ChoiceInformation ci = getParseContext().getChoices(); initConfig.addCategory2DefaultChoices(ci.getDefaultOptions()); - readSorts(); - readFuncAndPred(); + var warnings = new ArrayList(); + warnings.addAll(readSorts()); + warnings.addAll(readFuncAndPred()); - return DefaultImmutableSet.nil(); + return DefaultImmutableSet.fromCollection(warnings); } /** @@ -351,27 +353,32 @@ protected ProblemFinder getProblemFinder() { * reads the sorts declaration of the .key file only, modifying the sort namespace of the * initial configuration */ - public void readSorts() { + public Collection readSorts() { KeyAst.File ctx = getParseContext(); KeyIO io = new KeyIO(initConfig.getServices(), initConfig.namespaces()); io.evalDeclarations(ctx); ChoiceInformation choice = getParseContext().getChoices(); // we ignore the namespace of choice finder. initConfig.addCategory2DefaultChoices(choice.getDefaultOptions()); + + return io.getWarnings().stream().map(BuildingIssue::asPositionedString).toList(); } /** * reads the functions and predicates declared in the .key file only, modifying the function * namespaces of the respective taclet options. + * + * @return warnings during the interpretation of the AST constructs */ - public void readFuncAndPred() { + public List readFuncAndPred() { if (file == null) { - return; + return null; } KeyAst.File ctx = getParseContext(); KeyIO io = new KeyIO(initConfig.getServices(), initConfig.namespaces()); io.evalFuncAndPred(ctx); + return io.getWarnings().stream().map(BuildingIssue::asPositionedString).toList(); } diff --git a/key.core/src/main/java/de/uka/ilkd/key/proof/io/LDTInput.java b/key.core/src/main/java/de/uka/ilkd/key/proof/io/LDTInput.java index 7974c055c8..31f045d134 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/proof/io/LDTInput.java +++ b/key.core/src/main/java/de/uka/ilkd/key/proof/io/LDTInput.java @@ -110,19 +110,25 @@ public File readBootClassPath() { * reads all LDTs, i.e., all associated .key files with respect to the given modification * strategy. Reading is done in a special order: first all sort declarations then all function * and predicate declarations and third the rules. This procedure makes it possible to use all - * declared sorts in all rules, e.g. + * declared sorts in all rules. + * + * @return a list of warnings during the parsing the process */ @Override public ImmutableSet read() { + var warnings = new ArrayList(); + if (initConfig == null) { throw new IllegalStateException("LDTInput: InitConfig not set."); } for (KeYFile keYFile : keyFiles) { - keYFile.readSorts(); + var w = keYFile.readSorts(); + warnings.addAll(w); } for (KeYFile file : keyFiles) { - file.readFuncAndPred(); + var w = file.readFuncAndPred(); + warnings.addAll(w); } // create LDT objects to have them available for parsing initConfig.getServices().getTypeConverter().init(); @@ -135,7 +141,7 @@ public ImmutableSet read() { } - return DefaultImmutableSet.nil(); + return DefaultImmutableSet.fromCollection(warnings); } @Override diff --git a/key.core/src/main/java/de/uka/ilkd/key/util/parsing/BuildingIssue.java b/key.core/src/main/java/de/uka/ilkd/key/util/parsing/BuildingIssue.java index 1145427d2d..bca9c2fc21 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/util/parsing/BuildingIssue.java +++ b/key.core/src/main/java/de/uka/ilkd/key/util/parsing/BuildingIssue.java @@ -3,21 +3,50 @@ * SPDX-License-Identifier: GPL-2.0-only */ package de.uka.ilkd.key.util.parsing; +import java.net.URI; +import java.net.URISyntaxException; import javax.annotation.Nullable; import de.uka.ilkd.key.java.Position; +import de.uka.ilkd.key.parser.Location; +import de.uka.ilkd.key.speclang.PositionedString; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.Token; -public record BuildingIssue(String message,@Nullable Throwable cause,boolean isWarning,Position position){ - -public static BuildingIssue createError(String message,@Nullable ParserRuleContext token,@Nullable Throwable cause){return createError(message,token!=null?token.start:null,cause);} - -private static BuildingIssue fromToken(String message,boolean isWarning,@Nullable Token token,@Nullable Throwable cause){if(token!=null){var position=Position.fromToken(token);return new BuildingIssue(message,cause,isWarning,position);}return new BuildingIssue(message,cause,isWarning,Position.UNDEFINED);} - -public static BuildingIssue createError(String message,@Nullable Token token,@Nullable Throwable cause){return fromToken(message,false,token,cause);} - -public static BuildingIssue createWarning(String message,@Nullable ParserRuleContext token,@Nullable Throwable cause){return createWarning(message,token!=null?token.start:null,cause);} - -public static BuildingIssue createWarning(String message,@Nullable Token token,@Nullable Throwable cause){return fromToken(message,true,token,cause);}} +public record BuildingIssue(String message, @Nullable Throwable cause, boolean isWarning, + Position position, + @Nullable String sourceName) { + + public static BuildingIssue createError(String message, @Nullable ParserRuleContext token, @Nullable Throwable cause) { + return createError(message, token != null ? token.start : null, cause); + } + + private static BuildingIssue fromToken(String message, boolean isWarning, @Nullable Token token, @Nullable Throwable cause) { + if (token != null) { + var position = Position.fromToken(token); + return new BuildingIssue(message, cause, isWarning, position, token.getTokenSource().getSourceName()); + } + return new BuildingIssue(message, cause, isWarning, Position.UNDEFINED, null); + } + + public static BuildingIssue createError(String message, @Nullable Token token, @Nullable Throwable cause) { + return fromToken(message, false, token, cause); + } + + public static BuildingIssue createWarning(String message, @Nullable ParserRuleContext token, @Nullable Throwable cause) { + return createWarning(message, token != null ? token.start : null, cause); + } + + public static BuildingIssue createWarning(String message, @Nullable Token token, @Nullable Throwable cause) { + return fromToken(message, true, token, cause); + } + + public PositionedString asPositionedString() { + try { + return new PositionedString(message, new Location(new URI(sourceName), position)); + } catch (URISyntaxException e) { + return null; + } + } +} From c5a8b3a75e305b86994e0ef3566fe0a4951eb679 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Fri, 3 Nov 2023 15:46:05 +0000 Subject: [PATCH 11/66] fix merge errors --- .../src/main/java/de/uka/ilkd/key/logic/Sequent.java | 3 +-- .../ilkd/key/nparser/builder/DeclarationBuilder.java | 11 +++++------ .../uka/ilkd/key/nparser/builder/TacletPBuilder.java | 1 - 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/key.core/src/main/java/de/uka/ilkd/key/logic/Sequent.java b/key.core/src/main/java/de/uka/ilkd/key/logic/Sequent.java index dba8fa398b..0492f5fdb1 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/logic/Sequent.java +++ b/key.core/src/main/java/de/uka/ilkd/key/logic/Sequent.java @@ -6,7 +6,6 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Set; -import javax.annotation.Nonnull; import de.uka.ilkd.key.logic.label.TermLabel; import de.uka.ilkd.key.logic.op.QuantifiableVariable; @@ -84,7 +83,7 @@ private Sequent() { } /** creates new Sequent with antecedence and succedence */ - private Sequent(@Nonnull Semisequent antecedent, @Nonnull Semisequent succedent) { + private Sequent(Semisequent antecedent, Semisequent succedent) { assert !antecedent.isEmpty() || !succedent.isEmpty(); this.antecedent = antecedent; this.succedent = succedent; diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java index 8eb8dfa80d..539502aeb8 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java @@ -58,12 +58,11 @@ public Object visitDecls(KeYParser.DeclsContext ctx) { public Object visitDatatype_decl(KeYParser.Datatype_declContext ctx) { boolean freeAdt = ctx.FREE() != null; var name = ctx.name.getText(); - var s = new SortImpl(new Name(name)); - if (ctx.DOC_COMMENT() != null) { - var documentation = ctx.DOC_COMMENT().getText(); - s.setDocumentation(documentation); - } - s.setOrigin(BuilderHelpers.getPosition(ctx)); + var doc = ctx.DOC_COMMENT() != null + ? ctx.DOC_COMMENT().getText() + : null; + var origin = BuilderHelpers.getPosition(ctx); + var s = new SortImpl(new Name(name), ImmutableSet.empty(), false, doc, origin); sorts().add(s); return null; } 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 2e043e1d84..b60a48aef8 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 @@ -5,7 +5,6 @@ import java.util.*; import java.util.stream.Collectors; -import javax.annotation.Nullable; import de.uka.ilkd.key.java.Services; import de.uka.ilkd.key.java.abstraction.KeYJavaType; From 1e8a864a20eeff12eb553b1fa4d05dee440aaa4e Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Sun, 19 Nov 2023 16:07:42 +0100 Subject: [PATCH 12/66] spotless --- .../de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java index 539502aeb8..e65cd41cbf 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java @@ -58,9 +58,9 @@ public Object visitDecls(KeYParser.DeclsContext ctx) { public Object visitDatatype_decl(KeYParser.Datatype_declContext ctx) { boolean freeAdt = ctx.FREE() != null; var name = ctx.name.getText(); - var doc = ctx.DOC_COMMENT() != null - ? ctx.DOC_COMMENT().getText() - : null; + var doc = ctx.DOC_COMMENT() != null + ? ctx.DOC_COMMENT().getText() + : null; var origin = BuilderHelpers.getPosition(ctx); var s = new SortImpl(new Name(name), ImmutableSet.empty(), false, doc, origin); sorts().add(s); From 7d24dc6ea2a3bb3caf92813e76f9b2a2b92c7014 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Mon, 4 Dec 2023 00:54:59 +0100 Subject: [PATCH 13/66] implement the discussion of KaKeY --- .../key/nparser/builder/DeclarationBuilder.java | 11 ++++++++++- .../nparser/builder/FunctionPredicateBuilder.java | 15 ++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java index 3fcef655f2..475e36b719 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java @@ -18,10 +18,14 @@ import de.uka.ilkd.key.nparser.ParsingFacade; import de.uka.ilkd.key.rule.RuleSet; +import de.uka.ilkd.key.util.parsing.BuildingIssue; import org.key_project.util.collection.DefaultImmutableSet; import org.key_project.util.collection.ImmutableSet; import org.antlr.v4.runtime.Token; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import recoder.util.Debug; /** * This visitor evaluates all basic (level 0) declarations. This includes: @@ -41,6 +45,7 @@ */ public class DeclarationBuilder extends DefaultBuilder { private final Map category2Default = new HashMap<>(); + private static final Logger LOGGER = LoggerFactory.getLogger(DeclarationBuilder.class); public DeclarationBuilder(Services services, NamespaceSet nss) { super(services, nss); @@ -154,7 +159,11 @@ public Object visitOne_sort_decl(KeYParser.One_sort_declContext ctx) { sorts().add(s); createdSorts.add(s); } else { - addWarning(ctx, "Sort declaration is ignored, due to collision."); + // weigl: agreement on KaKeY meeting: this should be ignored until we finally have local namespaces + // for generic sorts + //addWarning(ctx, "Sort declaration is ignored, due to collision."); + LOGGER.info("Sort declaration is ignored, due to collision in {}", + BuilderHelpers.getPosition(ctx)); } } return createdSorts; diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java index a5f404cc4a..edeadf11d6 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java @@ -86,7 +86,7 @@ public Object visitPred_decl(KeYParser.Pred_declContext ctx) { public Object visitFunc_decl(KeYParser.Func_declContext ctx) { boolean unique = ctx.UNIQUE() != null; Sort retSort = accept(ctx.sortId()); - String func_name = accept(ctx.funcpred_name()); + String funcName = accept(ctx.funcpred_name()); List whereToBind = accept(ctx.where_to_bind()); List argSorts = accept(ctx.arg_sorts()); assert argSorts != null; @@ -96,11 +96,11 @@ public Object visitFunc_decl(KeYParser.Func_declContext ctx) { } Function f = null; - assert func_name != null; - int separatorIndex = func_name.indexOf("::"); + assert funcName != null; + int separatorIndex = funcName.indexOf("::"); if (separatorIndex > 0) { - String sortName = func_name.substring(0, separatorIndex); - String baseName = func_name.substring(separatorIndex + 2); + String sortName = funcName.substring(0, separatorIndex); + String baseName = funcName.substring(separatorIndex + 2); Sort genSort = lookupSort(sortName); if (genSort instanceof GenericSort) { f = SortDependingFunction.createFirstInstance((GenericSort) genSort, @@ -109,14 +109,15 @@ public Object visitFunc_decl(KeYParser.Func_declContext ctx) { } if (f == null) { - f = new Function(new Name(func_name), retSort, argSorts.toArray(new Sort[0]), + f = new Function(new Name(funcName), retSort, argSorts.toArray(new Sort[0]), whereToBind == null ? null : whereToBind.toArray(new Boolean[0]), unique); } if (lookup(f.name()) == null) { functions().add(f); } else { - addWarning(ctx, "Function '" + func_name + "' is already defined!"); + // weigl: agreement on KaKeY meeting: this should be an error. + semanticError(ctx, "Function '" + funcName + "' is already defined!"); } return f; } From 6137afd61aa017f706e581f48dd699014c2d3cc1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 20:59:42 +0000 Subject: [PATCH 14/66] Bump ch.qos.logback:logback-classic from 1.4.12 to 1.4.14 Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.4.12 to 1.4.14. - [Commits](https://github.com/qos-ch/logback/compare/v_1.4.12...v_1.4.14) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- key.ui/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 3794c4623d..c1712bd0fc 100644 --- a/build.gradle +++ b/build.gradle @@ -72,7 +72,7 @@ subprojects { dependencies { implementation("org.slf4j:slf4j-api:2.0.9") - testImplementation("ch.qos.logback:logback-classic:1.4.12") + testImplementation("ch.qos.logback:logback-classic:1.4.14") testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.1' testImplementation 'org.junit.jupiter:junit-jupiter-params:5.10.1' testImplementation project(':key.util') diff --git a/key.ui/build.gradle b/key.ui/build.gradle index 6e1727ddeb..797afdfac3 100644 --- a/key.ui/build.gradle +++ b/key.ui/build.gradle @@ -23,7 +23,7 @@ dependencies { api 'com.miglayout:miglayout-swing:11.2' //logging implementation used by the slf4j - implementation 'ch.qos.logback:logback-classic:1.4.12' + implementation 'ch.qos.logback:logback-classic:1.4.14' api 'org.key-project:docking-frames-common:1.1.3p1' api 'org.key-project:docking-frames-core:1.1.3p1' From 79bf09a69642fe04d18ea19dedb9bf99f747f4a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 20:59:44 +0000 Subject: [PATCH 15/66] Bump com.diffplug.spotless from 6.23.0 to 6.23.3 Bumps com.diffplug.spotless from 6.23.0 to 6.23.3. --- updated-dependencies: - dependency-name: com.diffplug.spotless dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 3794c4623d..665726cb5a 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ plugins { // id "com.github.ben-manes.versions" version "0.39.0" // Code formatting - id "com.diffplug.spotless" version "6.23.0" + id "com.diffplug.spotless" version "6.23.3" } // Configure this project for use inside IntelliJ: From ac7254d3d4dabc17e9999a897f749bf02bc0aee0 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Mon, 4 Dec 2023 02:25:03 +0100 Subject: [PATCH 16/66] Get rid of experimental flag using more fine-grained flags --- .../ilkd/key/settings/FeatureSettings.java | 171 ++++++++++++++++++ .../settings/ProofIndependentSMTSettings.java | 13 ++ .../settings/ProofIndependentSettings.java | 15 +- .../main/java/de/uka/ilkd/key/core/Main.java | 2 + .../java/de/uka/ilkd/key/gui/MainWindow.java | 12 +- .../de/uka/ilkd/key/gui/ProofMacroMenu.java | 37 +++- .../key/gui/extension/impl/Extension.java | 10 +- .../gui/nodeviews/CurrentGoalViewMenu.java | 6 +- .../gui/prooftree/ProofTreePopupFactory.java | 14 +- .../gui/settings/FeatureSettingsPanel.java | 53 ++++++ .../key/gui/settings/SettingsManager.java | 2 + .../gui/smt/settings/SMTSettingsProvider.java | 28 +-- .../key_project/slicing/EndToEndTests.java | 3 +- 13 files changed, 328 insertions(+), 38 deletions(-) create mode 100644 key.core/src/main/java/de/uka/ilkd/key/settings/FeatureSettings.java create mode 100644 key.ui/src/main/java/de/uka/ilkd/key/gui/settings/FeatureSettingsPanel.java diff --git a/key.core/src/main/java/de/uka/ilkd/key/settings/FeatureSettings.java b/key.core/src/main/java/de/uka/ilkd/key/settings/FeatureSettings.java new file mode 100644 index 0000000000..4258d5d20d --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/settings/FeatureSettings.java @@ -0,0 +1,171 @@ +package de.uka.ilkd.key.settings; + +import org.jspecify.annotations.NonNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; +import java.util.function.Consumer; + +/** + * The {@code experimental} is a bad idea. You cannot control which feature you want to activate. + * Instead, you are getting the full load of fun(ctionality). This class allows you to have more + * fine-grained feature flags. + * + * @author Alexander Weigl + * @version 1 (04.12.23) + */ +public class FeatureSettings extends AbstractSettings { + private static final Logger LOGGER = LoggerFactory.getLogger(FeatureSettings.class); + private static final String CATEGORY = "Feature"; + /** + * unstored, set by {@code --experimental} + */ + private boolean activateAll = false; + + /** + * persistent list of activated features + */ + private final Set activatedFeatures = new TreeSet<>(); + + public FeatureSettings() { + readFromSystemProperties(); + } + + public static boolean isFeatureActivated(Feature f) { + return ProofIndependentSettings.DEFAULT_INSTANCE.getFeatureSettings().isActivated(f); + } + + public static boolean isFeatureActivated(String s) { + return ProofIndependentSettings.DEFAULT_INSTANCE.getFeatureSettings().isActivated(s); + } + + /** + * Helper function for notification on feature flag changes. + * + * @param feature the feature to be listening on + * @param update a callback function which gets informed on changes with the new value + */ + public static void on(Feature feature, Consumer update) { + ProofIndependentSettings.DEFAULT_INSTANCE.getFeatureSettings().addPropertyChangeListener( + feature.id, evt -> update.accept((Boolean) evt.getNewValue()) + ); + } + + /** + * Use the system properties ({@code -P FEATURE:XXX=true} to activate a feature from the command line. + */ + private void readFromSystemProperties() { + var prefix = CATEGORY.toUpperCase() + ":"; + for (Map.Entry entries : System.getProperties().entrySet()) { + final var s = entries.getKey().toString(); + if (s.startsWith(prefix) && isTrue(entries.getValue())) { + final var feature = s.substring(prefix.length()); + activate(feature); + LOGGER.info("Activate feature: {}", feature); + } + } + } + + /** + * Checks if the given {@code value} represents something like to true. + * + * @return true, if {@code value} feels like a feature activation. + */ + private boolean isTrue(Object value) { + return switch (value.toString().toLowerCase()) { + case "true", "yes", "on" -> true; + default -> false; + }; + } + + @Override + public void readSettings(Properties props) { + activatedFeatures.clear(); + var prefix = "[" + CATEGORY + "]"; + for (Map.Entry entries : props.entrySet()) { + final var s = entries.getKey().toString(); + if (s.startsWith(prefix) && isTrue(entries.getValue())) { + final var feature = s.substring(prefix.length()); + activate(feature); + LOGGER.info("Activate feature: {}", feature); + } + } + } + + @Override + public void writeSettings(Properties props) { + var prefix = "[" + CATEGORY + "]"; + for (String activatedFeature : activatedFeatures) { + props.put(prefix + activatedFeature, true); + } + } + + @Override + public void readSettings(@NonNull Configuration props) { + activatedFeatures.clear(); + for (String s : props.getStringList(CATEGORY)) { + activate(s); + } + } + + @Override + public void writeSettings(@NonNull Configuration props) { + props.set(CATEGORY, activatedFeatures.stream().toList()); + } + + public boolean isActivated(Feature f) { + return isActivated(f.id); + } + + private boolean isActivated(String id) { + if (activateAll) return true; + return activatedFeatures.contains(id); + } + + public void activate(Feature f) { + activate(f.id); + } + + private void activate(String id) { + if (!isActivated(id)) { + activatedFeatures.add(id); + firePropertyChange(id, false, true); + } + } + + public void deactivate(Feature f) { + deactivate(f.id); + } + + private void deactivate(String id) { + if (isActivated(id)) { + firePropertyChange(id, true, false); + activatedFeatures.remove(id); + } + } + + public void setActivateAll(boolean b) { + activateAll = b; + } + + public boolean isActivateAll() { + return activateAll; + } + + public static Feature createFeature(String id) { + return new Feature(id, ""); + } + + public static Feature createFeature(String id, String doc) { + return new Feature(id, doc); + } + + public record Feature(String id, String documentation) { + public static final List FEATURES = new ArrayList<>(); + + public Feature { + FEATURES.add(this); + } + } +} diff --git a/key.core/src/main/java/de/uka/ilkd/key/settings/ProofIndependentSMTSettings.java b/key.core/src/main/java/de/uka/ilkd/key/settings/ProofIndependentSMTSettings.java index 4cdcc659e3..8ff2061040 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/settings/ProofIndependentSMTSettings.java +++ b/key.core/src/main/java/de/uka/ilkd/key/settings/ProofIndependentSMTSettings.java @@ -12,6 +12,8 @@ import de.uka.ilkd.key.smt.solvertypes.SolverType; import de.uka.ilkd.key.smt.solvertypes.SolverTypes; +import static de.uka.ilkd.key.settings.FeatureSettings.createFeature; + public final class ProofIndependentSMTSettings extends AbstractSettings { private static final String CATEGORY = "SMTSettings"; public static final String ACTIVE_SOLVER = "ActiveSolver"; @@ -49,6 +51,9 @@ public final class ProofIndependentSMTSettings extends AbstractSettings { public static final String PROP_STORE_TACLET_TRANSLATION_FILE = "PROP_STORE_TACLET_TRANSLATION_FILE"; + private static final FeatureSettings.Feature FEATURE_EXPERIMENTAL_SMT_SOLVERS = + createFeature("EXPERIMENTAL_SMT_SOLVERS", "Activate experimental SMT solvers"); + private final Collection solverTypes = new LinkedList<>(); private boolean showResultsAfterExecution = false; private boolean storeSMTTranslationToFile = false; @@ -497,6 +502,10 @@ public SolverTypeCollection computeActiveSolverUnion() { } + public Collection getUsableSolverUnions() { + return getUsableSolverUnions(FeatureSettings.isFeatureActivated(FEATURE_EXPERIMENTAL_SMT_SOLVERS)); + } + public Collection getUsableSolverUnions(boolean experimental) { LinkedList unions = new LinkedList<>(); for (SolverTypeCollection union : getSolverUnions(experimental)) { @@ -507,6 +516,10 @@ public Collection getUsableSolverUnions(boolean experiment return unions; } + public Collection getSolverUnions() { + return getSolverUnions(FeatureSettings.isFeatureActivated(FEATURE_EXPERIMENTAL_SMT_SOLVERS)); + } + public Collection getSolverUnions(boolean experimental) { LinkedList res = new LinkedList<>(solverUnions); if (experimental) { diff --git a/key.core/src/main/java/de/uka/ilkd/key/settings/ProofIndependentSettings.java b/key.core/src/main/java/de/uka/ilkd/key/settings/ProofIndependentSettings.java index dc57de8635..6d0cdd2af2 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/settings/ProofIndependentSettings.java +++ b/key.core/src/main/java/de/uka/ilkd/key/settings/ProofIndependentSettings.java @@ -39,12 +39,14 @@ public class ProofIndependentSettings { } private final ProofIndependentSMTSettings smtSettings = - ProofIndependentSMTSettings.getDefaultSettingsData(); + ProofIndependentSMTSettings.getDefaultSettingsData(); private final LemmaGeneratorSettings lemmaGeneratorSettings = new LemmaGeneratorSettings(); private final GeneralSettings generalSettings = new GeneralSettings(); private final ViewSettings viewSettings = new ViewSettings(); private final TermLabelSettings termLabelSettings = new TermLabelSettings(); + private final FeatureSettings featureSettings = new FeatureSettings(); + private File filename; @@ -59,6 +61,7 @@ private ProofIndependentSettings() { addSettings(lemmaGeneratorSettings); addSettings(generalSettings); addSettings(viewSettings); + addSettings(featureSettings); } private ProofIndependentSettings(File filename) { @@ -82,7 +85,7 @@ private void loadSettings() { if (filename.exists()) { if (Boolean.getBoolean(PathConfig.DISREGARD_SETTINGS_PROPERTY)) { LOGGER.warn("The settings in {} are *not* read due to flag '{}'", filename, - PathConfig.DISREGARD_SETTINGS_PROPERTY); + PathConfig.DISREGARD_SETTINGS_PROPERTY); } else { load(filename); } @@ -133,7 +136,7 @@ public void saveSettings() { } try (var out = - new BufferedWriter(new FileWriter(filename.toString().replace(".props", ".json")))) { + new BufferedWriter(new FileWriter(filename.toString().replace(".props", ".json")))) { config.save(out, "Proof-Independent-Settings-File. Generated " + new Date()); } catch (IOException e) { throw new RuntimeException(e); @@ -160,6 +163,10 @@ public ProofIndependentSMTSettings getSMTSettings() { return smtSettings; } + public FeatureSettings getFeatureSettings() { + return featureSettings; + } + /** * Checks if pretty printing is enabled or not. * @@ -173,7 +180,7 @@ public static boolean isUsePrettyPrinting() { * Defines if pretty printing is enabled or not. * * @param usePrettyPrinting {@code true} pretty printing is enabled, {@code false} pretty - * printing is disabled. + * printing is disabled. */ public static void setUsePrettyPrinting(boolean usePrettyPrinting) { ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().setUsePretty(usePrettyPrinting); diff --git a/key.ui/src/main/java/de/uka/ilkd/key/core/Main.java b/key.ui/src/main/java/de/uka/ilkd/key/core/Main.java index 60e0646a2c..f8563c3c62 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/core/Main.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/core/Main.java @@ -475,8 +475,10 @@ public static void evaluateOptions(CommandLine cl) { public static void setEnabledExperimentalFeatures(boolean state) { experimentalMode = state; LOGGER.debug("Experimental Features: {}", state); + ProofIndependentSettings.DEFAULT_INSTANCE.getFeatureSettings().setActivateAll(state); } + @Deprecated public static boolean isExperimentalMode() { return experimentalMode; } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java index c183cfe70a..4be397dc19 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java @@ -60,6 +60,7 @@ import de.uka.ilkd.key.proof.Proof; import de.uka.ilkd.key.proof.ProofEvent; import de.uka.ilkd.key.rule.RuleApp; +import de.uka.ilkd.key.settings.FeatureSettings; import de.uka.ilkd.key.settings.GeneralSettings; import de.uka.ilkd.key.settings.ProofIndependentSettings; import de.uka.ilkd.key.settings.ViewSettings; @@ -77,6 +78,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static de.uka.ilkd.key.settings.FeatureSettings.createFeature; +import static de.uka.ilkd.key.settings.FeatureSettings.isFeatureActivated; + @HelpInfo() public final class MainWindow extends JFrame { @@ -97,6 +101,8 @@ public final class MainWindow extends JFrame { "

"; private static final Logger LOGGER = LoggerFactory.getLogger(MainWindow.class); + private static final FeatureSettings.Feature FEATURE_BULK_UI_TEST = createFeature("BULK_UI_TEST", + "Activates the 'Run All Proofs' action that allows you to run multiple proofs inside the UI."); private static MainWindow instance = null; /** @@ -887,7 +893,7 @@ private JMenu createFileMenu() { submenu.add(loadUserDefinedTacletsForProvingAction); submenu.add(loadKeYTaclets); submenu.add(lemmaGenerationBatchModeAction); - if (Main.isExperimentalMode()) { + if (isFeatureActivated(FEATURE_BULK_UI_TEST)) { RunAllProofsAction runAllProofsAction = new RunAllProofsAction(this); submenu.add(runAllProofsAction); } @@ -1038,9 +1044,9 @@ private JMenu createHelpMenu() { */ public void updateSMTSelectMenu() { Collection solverUnions = ProofIndependentSettings.DEFAULT_INSTANCE - .getSMTSettings().getUsableSolverUnions(Main.isExperimentalMode()); + .getSMTSettings().getUsableSolverUnions(); - if (solverUnions == null || solverUnions.isEmpty()) { + if (solverUnions.isEmpty()) { updateDPSelectionMenu(); } else { updateDPSelectionMenu(solverUnions); diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/ProofMacroMenu.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/ProofMacroMenu.java index 03d702a6d2..1bcb839914 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/ProofMacroMenu.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/ProofMacroMenu.java @@ -3,11 +3,7 @@ * SPDX-License-Identifier: GPL-2.0-only */ package de.uka.ilkd.key.gui; -import java.util.*; -import javax.swing.*; - import de.uka.ilkd.key.core.KeYMediator; -import de.uka.ilkd.key.core.Main; import de.uka.ilkd.key.gui.actions.ProofScriptFromFileAction; import de.uka.ilkd.key.gui.actions.ProofScriptInputAction; import de.uka.ilkd.key.gui.actions.useractions.ProofMacroUserAction; @@ -15,9 +11,14 @@ import de.uka.ilkd.key.logic.PosInOccurrence; import de.uka.ilkd.key.macros.ProofMacro; import de.uka.ilkd.key.proof.Node; - +import de.uka.ilkd.key.settings.FeatureSettings; import org.key_project.util.reflection.ClassLoaderUtil; +import javax.swing.*; +import java.util.*; + +import static de.uka.ilkd.key.settings.FeatureSettings.createFeature; + /** * This class provides the user interface to the macro extensions. * @@ -55,6 +56,8 @@ public class ProofMacroMenu extends JMenu { public static final Iterable REGISTERED_MACROS = ClassLoaderUtil.loadServices(ProofMacro.class); + private static final FeatureSettings.Feature FEATURE_PROOF_SCRIPTS = createFeature("PROOF_SCRIPTS"); + /** * The number of defined macros. */ @@ -62,7 +65,7 @@ public class ProofMacroMenu extends JMenu { /** * Instantiates a new proof macro menu. - * + *

* Only applicable macros are added as menu items. * * @param mediator the mediator of the current proof. @@ -101,10 +104,24 @@ public ProofMacroMenu(KeYMediator mediator, PosInOccurrence posInOcc) { } } - if (Main.isExperimentalMode()) { - addSeparator(); - add(new JMenuItem(new ProofScriptFromFileAction(mediator))); - add(new JMenuItem(new ProofScriptInputAction(mediator))); + { + final var menuItemPSFile = new JMenuItem(new ProofScriptFromFileAction(mediator)); + final var menuItemPSString = new JMenuItem(new ProofScriptInputAction(mediator)); + + if (FeatureSettings.isFeatureActivated(FEATURE_PROOF_SCRIPTS)) { + addSeparator(); + add(menuItemPSFile); + add(menuItemPSString); + } + + FeatureSettings.on(FEATURE_PROOF_SCRIPTS, (newValue) -> { + if(newValue){ + add(menuItemPSFile); + add(menuItemPSString); + }else{ + remove(menuItemPSFile); + remove(menuItemPSString); + }}); } mediator.enableWhenProofLoaded(this); diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/extension/impl/Extension.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/extension/impl/Extension.java index b978dd49d1..323ccb2fe0 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/extension/impl/Extension.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/extension/impl/Extension.java @@ -10,6 +10,7 @@ import de.uka.ilkd.key.gui.extension.ExtensionManager; import de.uka.ilkd.key.gui.extension.api.KeYGuiExtension; +import de.uka.ilkd.key.settings.FeatureSettings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,7 +46,7 @@ public String getName() { } public boolean isOptional() { - return info != null && info.optional() && (!isExperimental() || Main.isExperimentalMode()); + return info != null && info.optional() && (!isExperimental() || FeatureSettings.isFeatureActivated(getName())); } public int getPriority() { @@ -54,9 +55,10 @@ public int getPriority() { public boolean isDisabled() { return isDisabledByMaintainer() // disabled by options - || (!Main.isExperimentalMode() && isExperimental()) // disabled because of wrong - // mode - || ExtensionManager.getExtensionSettings() // disabled by command line + // disabled because of wrong // mode + || (!FeatureSettings.isFeatureActivated(getName()) && isExperimental()) + // disabled by command line + || ExtensionManager.getExtensionSettings() .getForbiddenClasses().contains(getType().getName()); } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/nodeviews/CurrentGoalViewMenu.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/nodeviews/CurrentGoalViewMenu.java index cf21eccce4..be528b4a2d 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/nodeviews/CurrentGoalViewMenu.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/nodeviews/CurrentGoalViewMenu.java @@ -24,6 +24,7 @@ import de.uka.ilkd.key.gui.actions.useractions.FocussedAutoModeUserAction; import de.uka.ilkd.key.gui.join.JoinMenuItem; import de.uka.ilkd.key.gui.mergerule.MergeRuleMenuItem; +import de.uka.ilkd.key.gui.prooftree.ProofTreePopupFactory; import de.uka.ilkd.key.gui.smt.SMTMenuItem; import de.uka.ilkd.key.gui.smt.SolverListener; import de.uka.ilkd.key.java.ProgramElement; @@ -44,6 +45,7 @@ import de.uka.ilkd.key.rule.tacletbuilder.RewriteTacletGoalTemplate; import de.uka.ilkd.key.rule.tacletbuilder.TacletGoalTemplate; import de.uka.ilkd.key.settings.DefaultSMTSettings; +import de.uka.ilkd.key.settings.FeatureSettings; import de.uka.ilkd.key.settings.ProofIndependentSettings; import de.uka.ilkd.key.settings.ViewSettings; import de.uka.ilkd.key.smt.SMTProblem; @@ -227,7 +229,7 @@ private void addMacroMenu() { private void createSMTMenu(MenuControl control) { Collection solverUnions = ProofIndependentSettings.DEFAULT_INSTANCE - .getSMTSettings().getSolverUnions(Main.isExperimentalMode()); + .getSMTSettings().getSolverUnions(); if (!solverUnions.isEmpty()) { addSeparator(); } @@ -242,7 +244,7 @@ private void createSMTMenu(MenuControl control) { } private void createDelayedCutJoinMenu(MenuControl control) { - if (Main.isExperimentalMode()) { + if (FeatureSettings.isFeatureActivated(ProofTreePopupFactory.FEATURE_DELAY_CUT)) { List partner = JoinIsApplicable.INSTANCE .isApplicable(mediator.getSelectedGoal(), getPos().getPosInOccurrence()); if (!partner.isEmpty()) { diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreePopupFactory.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreePopupFactory.java index c12df26cb5..5c8879349b 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreePopupFactory.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreePopupFactory.java @@ -36,10 +36,15 @@ import de.uka.ilkd.key.prover.TaskStartedInfo; import de.uka.ilkd.key.prover.impl.DefaultTaskStartedInfo; import de.uka.ilkd.key.rule.OneStepSimplifierRuleApp; +import de.uka.ilkd.key.settings.FeatureSettings; import de.uka.ilkd.key.settings.GeneralSettings; +import static de.uka.ilkd.key.settings.FeatureSettings.createFeature; + public class ProofTreePopupFactory { public static final int ICON_SIZE = 16; + public static final FeatureSettings.Feature FEATURE_DELAY_CUT = + createFeature("DELAY_CUT", "Activates the delayed cut rule."); private ProofTreePopupFactory() { } @@ -99,10 +104,15 @@ private static void initMenu(JPopupMenu menu, ProofTreeContext ctx) { menu.add(new Prune(ctx)); initMacroMenu(menu, ctx); - if (Main.isExperimentalMode()) { - menu.add(new DelayedCut(ctx)); + + + final var delayedCut = new DelayedCut(ctx); + if (FeatureSettings.isFeatureActivated(FEATURE_DELAY_CUT)) { + menu.add(delayedCut); } + + menu.addSeparator(); menu.add(new Notes(ctx)); diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/FeatureSettingsPanel.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/FeatureSettingsPanel.java new file mode 100644 index 0000000000..c6bce2fae0 --- /dev/null +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/FeatureSettingsPanel.java @@ -0,0 +1,53 @@ +package de.uka.ilkd.key.gui.settings; + +import de.uka.ilkd.key.gui.MainWindow; +import de.uka.ilkd.key.settings.FeatureSettings; +import de.uka.ilkd.key.settings.ProofIndependentSettings; + +import javax.swing.*; +import java.util.IdentityHashMap; +import java.util.Map; + +/** + * @author Alexander Weigl + * @version 1 (04.12.23) + */ +public class FeatureSettingsPanel extends SettingsPanel implements SettingsProvider { + private Map checkboxes = new IdentityHashMap<>(); + + public FeatureSettingsPanel() { + setHeaderText("Feature Flags"); + setSubHeaderText("Activate or Deactivate specific experimental features in KeY."); + } + + @Override + public String getDescription() { + return "Feature Flags"; + } + + @Override + public JComponent getPanel(MainWindow window) { + pCenter.removeAll(); //start fresh + checkboxes.clear(); + var fs = ProofIndependentSettings.DEFAULT_INSTANCE.getFeatureSettings(); + for (FeatureSettings.Feature feature : FeatureSettings.Feature.FEATURES) { + var cb = addCheckBox(feature.id(), feature.documentation(), fs.isActivated(feature), null); + checkboxes.put(feature, cb); + } + return this; + } + + @Override + public void applySettings(MainWindow window) throws InvalidSettingsInputException { + var fs = ProofIndependentSettings.DEFAULT_INSTANCE.getFeatureSettings(); + for (var entry : checkboxes.entrySet()) { + var activate = entry.getValue().isSelected(); + var feature = entry.getKey(); + + if (activate) + fs.activate(feature); + else + fs.deactivate(feature); + } + } +} diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/SettingsManager.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/SettingsManager.java index 218fd14167..d0d0b1ef54 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/SettingsManager.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/SettingsManager.java @@ -41,6 +41,7 @@ public class SettingsManager { public static final ShortcutSettings SHORTCUT_SETTINGS = new ShortcutSettings(); public static final StandardUISettings STANDARD_UI_SETTINGS = new StandardUISettings(); public static final ColorSettingsProvider COLOR_SETTINGS = new ColorSettingsProvider(); + public static final FeatureSettingsPanel FEATURE_SETTINGS_PANEL = new FeatureSettingsPanel(); private static SettingsManager INSTANCE; private final List settingsProviders = new LinkedList<>(); @@ -61,6 +62,7 @@ public static SettingsManager getInstance() { INSTANCE.add(EXTENSION_MANAGER); INSTANCE.add(TACLET_OPTIONS_SETTINGS); // INSTANCE.add(COLOR_SETTINGS); + INSTANCE.add(FEATURE_SETTINGS_PANEL); } return INSTANCE; } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/SMTSettingsProvider.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/SMTSettingsProvider.java index 81dda805d8..2c3ffe5170 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/SMTSettingsProvider.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/SMTSettingsProvider.java @@ -3,23 +3,25 @@ * SPDX-License-Identifier: GPL-2.0-only */ package de.uka.ilkd.key.gui.smt.settings; -import java.math.RoundingMode; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import javax.swing.*; - -import de.uka.ilkd.key.core.Main; import de.uka.ilkd.key.gui.MainWindow; import de.uka.ilkd.key.gui.settings.SettingsManager; import de.uka.ilkd.key.gui.settings.SettingsPanel; import de.uka.ilkd.key.gui.settings.SettingsProvider; +import de.uka.ilkd.key.settings.FeatureSettings; import de.uka.ilkd.key.settings.ProofIndependentSMTSettings; import de.uka.ilkd.key.settings.ProofIndependentSMTSettings.ProgressMode; import de.uka.ilkd.key.settings.ProofIndependentSettings; import de.uka.ilkd.key.smt.solvertypes.SolverType; import de.uka.ilkd.key.smt.solvertypes.SolverTypes; +import javax.swing.*; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import static de.uka.ilkd.key.settings.FeatureSettings.createFeature; + /** * General SMT settings panel in the settings dialog. * @@ -99,6 +101,8 @@ public class SMTSettingsProvider extends SettingsPanel implements SettingsProvid "Overrides timeout for this solver. Values in seconds. If value <= 0, global timeout is used."; public static final String INFO_SOLVER_INFO = "Information about this solver."; + private static final FeatureSettings.Feature FEATURE_SMT_TRANSLATION_OPTIONS = createFeature("SMT_TRANS_OPTIONS"); + private final JTextField saveToFilePanel; private final JComboBox progressModeBox; private final JSpinner maxProcesses; @@ -134,13 +138,13 @@ public SMTSettingsProvider() { getChildren().add(new TacletTranslationOptions()); getChildren().add(new NewTranslationOptions()); - if (!Main.isExperimentalMode()) { - solverTypes.removeAll(SolverTypes.getLegacySolvers()); - } else { + if (FeatureSettings.isFeatureActivated(FEATURE_SMT_TRANSLATION_OPTIONS)) { getChildren().add(new TranslationOptions()); + } else { + solverTypes.removeAll(SolverTypes.getLegacySolvers()); } /* - * Only add options for those solvers that are actually theoretically available according to + * Only add options for those solvers that are actually theoretically available, according to * the settings. Note that these aren't necessarily all the types provided by SolverTypes, * depending on the implementation of the ProofIndependentSettings. */ @@ -176,7 +180,7 @@ public void applySettings(MainWindow window) { } private JSpinner createLocSetBoundField() { - return addNumberField("Locset bound:", 0L, (long) Integer.MAX_VALUE, 1, + return addNumberField("LocSet bound:", 0L, (long) Integer.MAX_VALUE, 1, INFO_BOUND, e -> settings.setLocsetBound(e.longValue())); } diff --git a/keyext.slicing/src/test/java/org/key_project/slicing/EndToEndTests.java b/keyext.slicing/src/test/java/org/key_project/slicing/EndToEndTests.java index 29ef8d4815..ff4397ea6d 100644 --- a/keyext.slicing/src/test/java/org/key_project/slicing/EndToEndTests.java +++ b/keyext.slicing/src/test/java/org/key_project/slicing/EndToEndTests.java @@ -15,6 +15,7 @@ import de.uka.ilkd.key.proof.Node; import de.uka.ilkd.key.proof.Proof; import de.uka.ilkd.key.proof.init.JavaProfile; +import de.uka.ilkd.key.settings.FeatureSettings; import de.uka.ilkd.key.settings.GeneralSettings; import de.uka.ilkd.key.settings.ProofIndependentSettings; import de.uka.ilkd.key.smt.SMTRuleApp; @@ -186,7 +187,7 @@ void sliceIfThenElseSplit() throws Exception { void sliceSimpleSMT() throws Exception { // only run this test if at least one SMT solver is available if (ProofIndependentSettings.DEFAULT_INSTANCE.getSMTSettings() - .getUsableSolverUnions(Main.isExperimentalMode()).isEmpty()) { + .getUsableSolverUnions().isEmpty()) { return; } sliceProof("/simpleSMT.proof", 1, 1, true, false); From 52b4e67494fd57f7ed52a21c08adfeaa731628f2 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Thu, 7 Dec 2023 03:43:14 +0100 Subject: [PATCH 17/66] fix bugs in loading json-based settings --- .../settings/AbstractPropertiesSettings.java | 35 ++++++++++++------- .../ilkd/key/settings/FeatureSettings.java | 2 +- .../settings/ProofIndependentSettings.java | 13 ++++--- .../uka/ilkd/key/settings/ViewSettings.java | 2 +- .../ilkd/key/gui/colors/ColorSettings.java | 6 ++++ 5 files changed, 39 insertions(+), 19 deletions(-) diff --git a/key.core/src/main/java/de/uka/ilkd/key/settings/AbstractPropertiesSettings.java b/key.core/src/main/java/de/uka/ilkd/key/settings/AbstractPropertiesSettings.java index d2b2112908..f4f237e496 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/settings/AbstractPropertiesSettings.java +++ b/key.core/src/main/java/de/uka/ilkd/key/settings/AbstractPropertiesSettings.java @@ -111,7 +111,7 @@ public void readSettings(Configuration props) { if (cat == null) return; propertyEntries.forEach(it -> { - final var value = cat.get(it.getKey()); + final var value = it.fromObject( cat.get(it.getKey()) ); if (value != null) { properties.put(it.getKey(), value); } @@ -127,31 +127,32 @@ public void writeSettings(Configuration props) { } protected PropertyEntry createDoubleProperty(String key, double defValue) { - PropertyEntry pe = new DefaultPropertyEntry<>(key, defValue, parseDouble); + PropertyEntry pe = new DefaultPropertyEntry<>(key, defValue, parseDouble, (it) -> (double) it); propertyEntries.add(pe); return pe; } protected PropertyEntry createIntegerProperty(String key, int defValue) { - PropertyEntry pe = new DefaultPropertyEntry<>(key, defValue, parseInt); + PropertyEntry pe = new DefaultPropertyEntry<>(key, defValue, parseInt, + (it) -> Math.toIntExact((Long) it)); propertyEntries.add(pe); return pe; } protected PropertyEntry createFloatProperty(String key, float defValue) { - PropertyEntry pe = new DefaultPropertyEntry<>(key, defValue, parseFloat); + PropertyEntry pe = new DefaultPropertyEntry<>(key, defValue, parseFloat, (it) -> (float) (double) it); propertyEntries.add(pe); return pe; } protected PropertyEntry createStringProperty(String key, String defValue) { - PropertyEntry pe = new DefaultPropertyEntry<>(key, defValue, id -> id); + PropertyEntry pe = new DefaultPropertyEntry<>(key, defValue, id -> id, Object::toString); propertyEntries.add(pe); return pe; } protected PropertyEntry createBooleanProperty(String key, boolean defValue) { - PropertyEntry pe = new DefaultPropertyEntry<>(key, defValue, parseBoolean); + PropertyEntry pe = new DefaultPropertyEntry<>(key, defValue, parseBoolean, (it) -> (Boolean) it); propertyEntries.add(pe); return pe; } @@ -159,7 +160,7 @@ protected PropertyEntry createBooleanProperty(String key, boolean defVa protected PropertyEntry> createStringSetProperty(String key, String defValue) { PropertyEntry> pe = new DefaultPropertyEntry<>(key, parseStringSet(defValue), AbstractPropertiesSettings::parseStringSet, - AbstractPropertiesSettings::stringSetToString); + AbstractPropertiesSettings::stringSetToString, (it)->new LinkedHashSet<>((Collection) it)); propertyEntries.add(pe); return pe; } @@ -174,8 +175,8 @@ protected PropertyEntry> createStringSetProperty(String key, String protected PropertyEntry> createStringListProperty(@NonNull String key, @Nullable String defValue) { PropertyEntry> pe = new DefaultPropertyEntry<>(key, parseStringList(defValue), - AbstractPropertiesSettings::parseStringList, - AbstractPropertiesSettings::stringListToString); + AbstractPropertiesSettings::parseStringList, + AbstractPropertiesSettings::stringListToString, it -> (List) it); propertyEntries.add(pe); return pe; } @@ -195,6 +196,8 @@ default void update() { } String value(); + + T fromObject(@Nullable Object o); } @@ -204,16 +207,19 @@ class DefaultPropertyEntry implements PropertyEntry { private final Function convert; private final Function toString; - private DefaultPropertyEntry(String key, T defaultValue, Function convert) { - this(key, defaultValue, convert, Objects::toString); + private final Function fromObject; + + private DefaultPropertyEntry(String key, T defaultValue, Function convert, Function fromObject) { + this(key, defaultValue, convert, Objects::toString, fromObject); } private DefaultPropertyEntry(String key, T defaultValue, Function convert, - Function toString) { + Function toString, Function fromObject) { this.key = key; this.defaultValue = defaultValue; this.convert = convert; this.toString = toString; + this.fromObject = fromObject; } @Override @@ -255,5 +261,10 @@ public String value() { return toString.apply(v); } } + + @Override + public T fromObject(@Nullable Object o) { + return null; + } } } diff --git a/key.core/src/main/java/de/uka/ilkd/key/settings/FeatureSettings.java b/key.core/src/main/java/de/uka/ilkd/key/settings/FeatureSettings.java index 4258d5d20d..9586766080 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/settings/FeatureSettings.java +++ b/key.core/src/main/java/de/uka/ilkd/key/settings/FeatureSettings.java @@ -97,7 +97,7 @@ public void readSettings(Properties props) { public void writeSettings(Properties props) { var prefix = "[" + CATEGORY + "]"; for (String activatedFeature : activatedFeatures) { - props.put(prefix + activatedFeature, true); + props.put(prefix + activatedFeature, "true"); } } diff --git a/key.core/src/main/java/de/uka/ilkd/key/settings/ProofIndependentSettings.java b/key.core/src/main/java/de/uka/ilkd/key/settings/ProofIndependentSettings.java index 6d0cdd2af2..8659ff8b26 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/settings/ProofIndependentSettings.java +++ b/key.core/src/main/java/de/uka/ilkd/key/settings/ProofIndependentSettings.java @@ -91,12 +91,12 @@ private void loadSettings() { } } } catch (IOException e) { - throw new RuntimeException(e); + LOGGER.error("Could not load settings from {}", filename, e); } } private void load(File file) throws IOException { - if (!file.getName().endsWith(".toml")) { + if (!file.getName().endsWith(".json")) { try (FileInputStream in = new FileInputStream(file)) { Properties properties = new Properties(); properties.load(in); @@ -107,11 +107,14 @@ private void load(File file) throws IOException { } } else { this.lastReadedConfiguration = Configuration.load(file); + for (Settings settings : settings) { + settings.readSettings(lastReadedConfiguration); + } } } public void saveSettings() { - if (!filename.getName().endsWith(".toml")) { + if (!filename.getName().endsWith(".json")) { Properties result = new Properties(); for (Settings settings : settings) { settings.writeSettings(result); @@ -124,7 +127,7 @@ public void saveSettings() { try (var out = new FileOutputStream(filename)) { result.store(out, "Proof-Independent-Settings-File. Generated " + new Date()); } catch (IOException e) { - throw new RuntimeException(e); + LOGGER.error("Could not store settings to {}", filename, e); } } @@ -139,7 +142,7 @@ public void saveSettings() { new BufferedWriter(new FileWriter(filename.toString().replace(".props", ".json")))) { config.save(out, "Proof-Independent-Settings-File. Generated " + new Date()); } catch (IOException e) { - throw new RuntimeException(e); + LOGGER.error("Could not store settings to {}", filename, e); } } diff --git a/key.core/src/main/java/de/uka/ilkd/key/settings/ViewSettings.java b/key.core/src/main/java/de/uka/ilkd/key/settings/ViewSettings.java index 09bcadfa5e..57eebb2f49 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/settings/ViewSettings.java +++ b/key.core/src/main/java/de/uka/ilkd/key/settings/ViewSettings.java @@ -311,7 +311,7 @@ public void setShowWholeTaclet(boolean b) { * @return the current sizeIndex */ public int sizeIndex() { - return sizeIndex.get(); + return Math.toIntExact(sizeIndex.get()); } /** diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/colors/ColorSettings.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/colors/ColorSettings.java index 386909d996..e1ba497b6f 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/colors/ColorSettings.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/colors/ColorSettings.java @@ -20,6 +20,7 @@ import de.uka.ilkd.key.settings.Configuration; import de.uka.ilkd.key.settings.PathConfig; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -165,6 +166,11 @@ public String value() { } } + @Override + public Color fromObject(@Nullable Object o) { + return fromHex(o.toString()); + } + @Override public void parseFrom(String v) { final var old = value(); From 28a8e67873390bad3212afebdd1a0862cf0956a1 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Thu, 7 Dec 2023 03:45:48 +0100 Subject: [PATCH 18/66] refine javadoc --- .../java/de/uka/ilkd/key/settings/FeatureSettings.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/key.core/src/main/java/de/uka/ilkd/key/settings/FeatureSettings.java b/key.core/src/main/java/de/uka/ilkd/key/settings/FeatureSettings.java index 9586766080..d0e57b8a9a 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/settings/FeatureSettings.java +++ b/key.core/src/main/java/de/uka/ilkd/key/settings/FeatureSettings.java @@ -8,9 +8,12 @@ import java.util.function.Consumer; /** - * The {@code experimental} is a bad idea. You cannot control which feature you want to activate. + * Feature flags for the selected and deselected of experimental features. + *

+ * In the old days of KeY, we used to have {@code --experimental} flag, which was a bad idea. + * You cannot control which feature you want to activate. * Instead, you are getting the full load of fun(ctionality). This class allows you to have more - * fine-grained feature flags. + * fine-grained feature flags by defining feature flags which are controllable by the user. * * @author Alexander Weigl * @version 1 (04.12.23) From ec8218bfd57bca5fc3098978332d78b04976084b Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Thu, 7 Dec 2023 03:46:35 +0100 Subject: [PATCH 19/66] spotless --- .../settings/AbstractPropertiesSettings.java | 28 +++++++++++-------- .../ilkd/key/settings/FeatureSettings.java | 24 +++++++++------- .../settings/ProofIndependentSMTSettings.java | 8 ++++-- .../settings/ProofIndependentSettings.java | 8 +++--- .../java/de/uka/ilkd/key/gui/MainWindow.java | 6 ++-- .../de/uka/ilkd/key/gui/ProofMacroMenu.java | 17 ++++++----- .../key/gui/extension/impl/Extension.java | 6 ++-- .../gui/nodeviews/CurrentGoalViewMenu.java | 1 - .../gui/prooftree/ProofTreePopupFactory.java | 3 +- .../gui/settings/FeatureSettingsPanel.java | 16 +++++++---- .../gui/smt/settings/SMTSettingsProvider.java | 18 ++++++------ .../key_project/slicing/EndToEndTests.java | 2 -- 12 files changed, 77 insertions(+), 60 deletions(-) diff --git a/key.core/src/main/java/de/uka/ilkd/key/settings/AbstractPropertiesSettings.java b/key.core/src/main/java/de/uka/ilkd/key/settings/AbstractPropertiesSettings.java index f4f237e496..c39e552b02 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/settings/AbstractPropertiesSettings.java +++ b/key.core/src/main/java/de/uka/ilkd/key/settings/AbstractPropertiesSettings.java @@ -111,7 +111,7 @@ public void readSettings(Configuration props) { if (cat == null) return; propertyEntries.forEach(it -> { - final var value = it.fromObject( cat.get(it.getKey()) ); + final var value = it.fromObject(cat.get(it.getKey())); if (value != null) { properties.put(it.getKey(), value); } @@ -127,32 +127,36 @@ public void writeSettings(Configuration props) { } protected PropertyEntry createDoubleProperty(String key, double defValue) { - PropertyEntry pe = new DefaultPropertyEntry<>(key, defValue, parseDouble, (it) -> (double) it); + PropertyEntry pe = + new DefaultPropertyEntry<>(key, defValue, parseDouble, (it) -> (double) it); propertyEntries.add(pe); return pe; } protected PropertyEntry createIntegerProperty(String key, int defValue) { PropertyEntry pe = new DefaultPropertyEntry<>(key, defValue, parseInt, - (it) -> Math.toIntExact((Long) it)); + (it) -> Math.toIntExact((Long) it)); propertyEntries.add(pe); return pe; } protected PropertyEntry createFloatProperty(String key, float defValue) { - PropertyEntry pe = new DefaultPropertyEntry<>(key, defValue, parseFloat, (it) -> (float) (double) it); + PropertyEntry pe = + new DefaultPropertyEntry<>(key, defValue, parseFloat, (it) -> (float) (double) it); propertyEntries.add(pe); return pe; } protected PropertyEntry createStringProperty(String key, String defValue) { - PropertyEntry pe = new DefaultPropertyEntry<>(key, defValue, id -> id, Object::toString); + PropertyEntry pe = + new DefaultPropertyEntry<>(key, defValue, id -> id, Object::toString); propertyEntries.add(pe); return pe; } protected PropertyEntry createBooleanProperty(String key, boolean defValue) { - PropertyEntry pe = new DefaultPropertyEntry<>(key, defValue, parseBoolean, (it) -> (Boolean) it); + PropertyEntry pe = + new DefaultPropertyEntry<>(key, defValue, parseBoolean, (it) -> (Boolean) it); propertyEntries.add(pe); return pe; } @@ -160,7 +164,8 @@ protected PropertyEntry createBooleanProperty(String key, boolean defVa protected PropertyEntry> createStringSetProperty(String key, String defValue) { PropertyEntry> pe = new DefaultPropertyEntry<>(key, parseStringSet(defValue), AbstractPropertiesSettings::parseStringSet, - AbstractPropertiesSettings::stringSetToString, (it)->new LinkedHashSet<>((Collection) it)); + AbstractPropertiesSettings::stringSetToString, + (it) -> new LinkedHashSet<>((Collection) it)); propertyEntries.add(pe); return pe; } @@ -175,8 +180,8 @@ protected PropertyEntry> createStringSetProperty(String key, String protected PropertyEntry> createStringListProperty(@NonNull String key, @Nullable String defValue) { PropertyEntry> pe = new DefaultPropertyEntry<>(key, parseStringList(defValue), - AbstractPropertiesSettings::parseStringList, - AbstractPropertiesSettings::stringListToString, it -> (List) it); + AbstractPropertiesSettings::parseStringList, + AbstractPropertiesSettings::stringListToString, it -> (List) it); propertyEntries.add(pe); return pe; } @@ -209,12 +214,13 @@ class DefaultPropertyEntry implements PropertyEntry { private final Function fromObject; - private DefaultPropertyEntry(String key, T defaultValue, Function convert, Function fromObject) { + private DefaultPropertyEntry(String key, T defaultValue, Function convert, + Function fromObject) { this(key, defaultValue, convert, Objects::toString, fromObject); } private DefaultPropertyEntry(String key, T defaultValue, Function convert, - Function toString, Function fromObject) { + Function toString, Function fromObject) { this.key = key; this.defaultValue = defaultValue; this.convert = convert; diff --git a/key.core/src/main/java/de/uka/ilkd/key/settings/FeatureSettings.java b/key.core/src/main/java/de/uka/ilkd/key/settings/FeatureSettings.java index d0e57b8a9a..96d3a47bc0 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/settings/FeatureSettings.java +++ b/key.core/src/main/java/de/uka/ilkd/key/settings/FeatureSettings.java @@ -1,12 +1,15 @@ +/* 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.settings; +import java.util.*; +import java.util.function.Consumer; + import org.jspecify.annotations.NonNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.*; -import java.util.function.Consumer; - /** * Feature flags for the selected and deselected of experimental features. *

@@ -47,16 +50,16 @@ public static boolean isFeatureActivated(String s) { * Helper function for notification on feature flag changes. * * @param feature the feature to be listening on - * @param update a callback function which gets informed on changes with the new value + * @param update a callback function which gets informed on changes with the new value */ public static void on(Feature feature, Consumer update) { ProofIndependentSettings.DEFAULT_INSTANCE.getFeatureSettings().addPropertyChangeListener( - feature.id, evt -> update.accept((Boolean) evt.getNewValue()) - ); + feature.id, evt -> update.accept((Boolean) evt.getNewValue())); } /** - * Use the system properties ({@code -P FEATURE:XXX=true} to activate a feature from the command line. + * Use the system properties ({@code -P FEATURE:XXX=true} to activate a feature from the command + * line. */ private void readFromSystemProperties() { var prefix = CATEGORY.toUpperCase() + ":"; @@ -77,8 +80,8 @@ private void readFromSystemProperties() { */ private boolean isTrue(Object value) { return switch (value.toString().toLowerCase()) { - case "true", "yes", "on" -> true; - default -> false; + case "true", "yes", "on" -> true; + default -> false; }; } @@ -122,7 +125,8 @@ public boolean isActivated(Feature f) { } private boolean isActivated(String id) { - if (activateAll) return true; + if (activateAll) + return true; return activatedFeatures.contains(id); } diff --git a/key.core/src/main/java/de/uka/ilkd/key/settings/ProofIndependentSMTSettings.java b/key.core/src/main/java/de/uka/ilkd/key/settings/ProofIndependentSMTSettings.java index 8ff2061040..1e2c91fd50 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/settings/ProofIndependentSMTSettings.java +++ b/key.core/src/main/java/de/uka/ilkd/key/settings/ProofIndependentSMTSettings.java @@ -52,7 +52,7 @@ public final class ProofIndependentSMTSettings extends AbstractSettings { "PROP_STORE_TACLET_TRANSLATION_FILE"; private static final FeatureSettings.Feature FEATURE_EXPERIMENTAL_SMT_SOLVERS = - createFeature("EXPERIMENTAL_SMT_SOLVERS", "Activate experimental SMT solvers"); + createFeature("EXPERIMENTAL_SMT_SOLVERS", "Activate experimental SMT solvers"); private final Collection solverTypes = new LinkedList<>(); private boolean showResultsAfterExecution = false; @@ -503,7 +503,8 @@ public SolverTypeCollection computeActiveSolverUnion() { public Collection getUsableSolverUnions() { - return getUsableSolverUnions(FeatureSettings.isFeatureActivated(FEATURE_EXPERIMENTAL_SMT_SOLVERS)); + return getUsableSolverUnions( + FeatureSettings.isFeatureActivated(FEATURE_EXPERIMENTAL_SMT_SOLVERS)); } public Collection getUsableSolverUnions(boolean experimental) { @@ -517,7 +518,8 @@ public Collection getUsableSolverUnions(boolean experiment } public Collection getSolverUnions() { - return getSolverUnions(FeatureSettings.isFeatureActivated(FEATURE_EXPERIMENTAL_SMT_SOLVERS)); + return getSolverUnions( + FeatureSettings.isFeatureActivated(FEATURE_EXPERIMENTAL_SMT_SOLVERS)); } public Collection getSolverUnions(boolean experimental) { diff --git a/key.core/src/main/java/de/uka/ilkd/key/settings/ProofIndependentSettings.java b/key.core/src/main/java/de/uka/ilkd/key/settings/ProofIndependentSettings.java index 8659ff8b26..8592d0e06d 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/settings/ProofIndependentSettings.java +++ b/key.core/src/main/java/de/uka/ilkd/key/settings/ProofIndependentSettings.java @@ -39,7 +39,7 @@ public class ProofIndependentSettings { } private final ProofIndependentSMTSettings smtSettings = - ProofIndependentSMTSettings.getDefaultSettingsData(); + ProofIndependentSMTSettings.getDefaultSettingsData(); private final LemmaGeneratorSettings lemmaGeneratorSettings = new LemmaGeneratorSettings(); private final GeneralSettings generalSettings = new GeneralSettings(); @@ -85,7 +85,7 @@ private void loadSettings() { if (filename.exists()) { if (Boolean.getBoolean(PathConfig.DISREGARD_SETTINGS_PROPERTY)) { LOGGER.warn("The settings in {} are *not* read due to flag '{}'", filename, - PathConfig.DISREGARD_SETTINGS_PROPERTY); + PathConfig.DISREGARD_SETTINGS_PROPERTY); } else { load(filename); } @@ -139,7 +139,7 @@ public void saveSettings() { } try (var out = - new BufferedWriter(new FileWriter(filename.toString().replace(".props", ".json")))) { + new BufferedWriter(new FileWriter(filename.toString().replace(".props", ".json")))) { config.save(out, "Proof-Independent-Settings-File. Generated " + new Date()); } catch (IOException e) { LOGGER.error("Could not store settings to {}", filename, e); @@ -183,7 +183,7 @@ public static boolean isUsePrettyPrinting() { * Defines if pretty printing is enabled or not. * * @param usePrettyPrinting {@code true} pretty printing is enabled, {@code false} pretty - * printing is disabled. + * printing is disabled. */ public static void setUsePrettyPrinting(boolean usePrettyPrinting) { ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().setUsePretty(usePrettyPrinting); diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java index 4be397dc19..610c5230ad 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java @@ -30,7 +30,6 @@ import de.uka.ilkd.key.core.KeYMediator; import de.uka.ilkd.key.core.KeYSelectionEvent; import de.uka.ilkd.key.core.KeYSelectionListener; -import de.uka.ilkd.key.core.Main; import de.uka.ilkd.key.gui.actions.*; import de.uka.ilkd.key.gui.actions.useractions.ProofLoadUserAction; import de.uka.ilkd.key.gui.configuration.Config; @@ -101,8 +100,9 @@ public final class MainWindow extends JFrame { "

"; private static final Logger LOGGER = LoggerFactory.getLogger(MainWindow.class); - private static final FeatureSettings.Feature FEATURE_BULK_UI_TEST = createFeature("BULK_UI_TEST", - "Activates the 'Run All Proofs' action that allows you to run multiple proofs inside the UI."); + private static final FeatureSettings.Feature FEATURE_BULK_UI_TEST = createFeature( + "BULK_UI_TEST", + "Activates the 'Run All Proofs' action that allows you to run multiple proofs inside the UI."); private static MainWindow instance = null; /** diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/ProofMacroMenu.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/ProofMacroMenu.java index 1bcb839914..9a41bca4fd 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/ProofMacroMenu.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/ProofMacroMenu.java @@ -3,6 +3,9 @@ * SPDX-License-Identifier: GPL-2.0-only */ package de.uka.ilkd.key.gui; +import java.util.*; +import javax.swing.*; + import de.uka.ilkd.key.core.KeYMediator; import de.uka.ilkd.key.gui.actions.ProofScriptFromFileAction; import de.uka.ilkd.key.gui.actions.ProofScriptInputAction; @@ -12,10 +15,8 @@ import de.uka.ilkd.key.macros.ProofMacro; import de.uka.ilkd.key.proof.Node; import de.uka.ilkd.key.settings.FeatureSettings; -import org.key_project.util.reflection.ClassLoaderUtil; -import javax.swing.*; -import java.util.*; +import org.key_project.util.reflection.ClassLoaderUtil; import static de.uka.ilkd.key.settings.FeatureSettings.createFeature; @@ -56,7 +57,8 @@ public class ProofMacroMenu extends JMenu { public static final Iterable REGISTERED_MACROS = ClassLoaderUtil.loadServices(ProofMacro.class); - private static final FeatureSettings.Feature FEATURE_PROOF_SCRIPTS = createFeature("PROOF_SCRIPTS"); + private static final FeatureSettings.Feature FEATURE_PROOF_SCRIPTS = + createFeature("PROOF_SCRIPTS"); /** * The number of defined macros. @@ -115,13 +117,14 @@ public ProofMacroMenu(KeYMediator mediator, PosInOccurrence posInOcc) { } FeatureSettings.on(FEATURE_PROOF_SCRIPTS, (newValue) -> { - if(newValue){ + if (newValue) { add(menuItemPSFile); add(menuItemPSString); - }else{ + } else { remove(menuItemPSFile); remove(menuItemPSString); - }}); + } + }); } mediator.enableWhenProofLoaded(this); diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/extension/impl/Extension.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/extension/impl/Extension.java index 323ccb2fe0..15158adefc 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/extension/impl/Extension.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/extension/impl/Extension.java @@ -6,11 +6,10 @@ import java.lang.reflect.InvocationTargetException; import java.util.Objects; -import de.uka.ilkd.key.core.Main; import de.uka.ilkd.key.gui.extension.ExtensionManager; import de.uka.ilkd.key.gui.extension.api.KeYGuiExtension; - import de.uka.ilkd.key.settings.FeatureSettings; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,7 +45,8 @@ public String getName() { } public boolean isOptional() { - return info != null && info.optional() && (!isExperimental() || FeatureSettings.isFeatureActivated(getName())); + return info != null && info.optional() + && (!isExperimental() || FeatureSettings.isFeatureActivated(getName())); } public int getPriority() { diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/nodeviews/CurrentGoalViewMenu.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/nodeviews/CurrentGoalViewMenu.java index be528b4a2d..3fc648efbe 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/nodeviews/CurrentGoalViewMenu.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/nodeviews/CurrentGoalViewMenu.java @@ -18,7 +18,6 @@ import javax.swing.*; import de.uka.ilkd.key.core.KeYMediator; -import de.uka.ilkd.key.core.Main; import de.uka.ilkd.key.gui.MainWindow; import de.uka.ilkd.key.gui.ProofMacroMenu; import de.uka.ilkd.key.gui.actions.useractions.FocussedAutoModeUserAction; diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreePopupFactory.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreePopupFactory.java index 5c8879349b..bdca3bbd4e 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreePopupFactory.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreePopupFactory.java @@ -13,7 +13,6 @@ import javax.swing.tree.TreePath; import de.uka.ilkd.key.core.KeYMediator; -import de.uka.ilkd.key.core.Main; import de.uka.ilkd.key.gui.InspectorForDecisionPredicates; import de.uka.ilkd.key.gui.MainWindow; import de.uka.ilkd.key.gui.ProofMacroMenu; @@ -44,7 +43,7 @@ public class ProofTreePopupFactory { public static final int ICON_SIZE = 16; public static final FeatureSettings.Feature FEATURE_DELAY_CUT = - createFeature("DELAY_CUT", "Activates the delayed cut rule."); + createFeature("DELAY_CUT", "Activates the delayed cut rule."); private ProofTreePopupFactory() { } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/FeatureSettingsPanel.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/FeatureSettingsPanel.java index c6bce2fae0..f05722d206 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/FeatureSettingsPanel.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/FeatureSettingsPanel.java @@ -1,13 +1,16 @@ +/* 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.settings; +import java.util.IdentityHashMap; +import java.util.Map; +import javax.swing.*; + import de.uka.ilkd.key.gui.MainWindow; import de.uka.ilkd.key.settings.FeatureSettings; import de.uka.ilkd.key.settings.ProofIndependentSettings; -import javax.swing.*; -import java.util.IdentityHashMap; -import java.util.Map; - /** * @author Alexander Weigl * @version 1 (04.12.23) @@ -27,11 +30,12 @@ public String getDescription() { @Override public JComponent getPanel(MainWindow window) { - pCenter.removeAll(); //start fresh + pCenter.removeAll(); // start fresh checkboxes.clear(); var fs = ProofIndependentSettings.DEFAULT_INSTANCE.getFeatureSettings(); for (FeatureSettings.Feature feature : FeatureSettings.Feature.FEATURES) { - var cb = addCheckBox(feature.id(), feature.documentation(), fs.isActivated(feature), null); + var cb = + addCheckBox(feature.id(), feature.documentation(), fs.isActivated(feature), null); checkboxes.put(feature, cb); } return this; diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/SMTSettingsProvider.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/SMTSettingsProvider.java index 2c3ffe5170..29ee4ff713 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/SMTSettingsProvider.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/SMTSettingsProvider.java @@ -3,6 +3,12 @@ * SPDX-License-Identifier: GPL-2.0-only */ package de.uka.ilkd.key.gui.smt.settings; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import javax.swing.*; + import de.uka.ilkd.key.gui.MainWindow; import de.uka.ilkd.key.gui.settings.SettingsManager; import de.uka.ilkd.key.gui.settings.SettingsPanel; @@ -14,12 +20,6 @@ import de.uka.ilkd.key.smt.solvertypes.SolverType; import de.uka.ilkd.key.smt.solvertypes.SolverTypes; -import javax.swing.*; -import java.math.RoundingMode; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - import static de.uka.ilkd.key.settings.FeatureSettings.createFeature; /** @@ -101,7 +101,8 @@ public class SMTSettingsProvider extends SettingsPanel implements SettingsProvid "Overrides timeout for this solver. Values in seconds. If value <= 0, global timeout is used."; public static final String INFO_SOLVER_INFO = "Information about this solver."; - private static final FeatureSettings.Feature FEATURE_SMT_TRANSLATION_OPTIONS = createFeature("SMT_TRANS_OPTIONS"); + private static final FeatureSettings.Feature FEATURE_SMT_TRANSLATION_OPTIONS = + createFeature("SMT_TRANS_OPTIONS"); private final JTextField saveToFilePanel; private final JComboBox progressModeBox; @@ -144,7 +145,8 @@ public SMTSettingsProvider() { solverTypes.removeAll(SolverTypes.getLegacySolvers()); } /* - * Only add options for those solvers that are actually theoretically available, according to + * Only add options for those solvers that are actually theoretically available, according + * to * the settings. Note that these aren't necessarily all the types provided by SolverTypes, * depending on the implementation of the ProofIndependentSettings. */ diff --git a/keyext.slicing/src/test/java/org/key_project/slicing/EndToEndTests.java b/keyext.slicing/src/test/java/org/key_project/slicing/EndToEndTests.java index ff4397ea6d..dc6e328506 100644 --- a/keyext.slicing/src/test/java/org/key_project/slicing/EndToEndTests.java +++ b/keyext.slicing/src/test/java/org/key_project/slicing/EndToEndTests.java @@ -9,13 +9,11 @@ import de.uka.ilkd.key.control.DefaultUserInterfaceControl; import de.uka.ilkd.key.control.KeYEnvironment; -import de.uka.ilkd.key.core.Main; import de.uka.ilkd.key.logic.PosInOccurrence; import de.uka.ilkd.key.logic.PosInTerm; import de.uka.ilkd.key.proof.Node; import de.uka.ilkd.key.proof.Proof; import de.uka.ilkd.key.proof.init.JavaProfile; -import de.uka.ilkd.key.settings.FeatureSettings; import de.uka.ilkd.key.settings.GeneralSettings; import de.uka.ilkd.key.settings.ProofIndependentSettings; import de.uka.ilkd.key.smt.SMTRuleApp; From 9f54a3b5779948edb11a4c96a7ef58685baa3d6c Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Fri, 1 Dec 2023 10:34:45 +0100 Subject: [PATCH 20/66] Fix update of proof tree in case of filter changes (fixes #3367) --- .../de/uka/ilkd/key/gui/prooftree/ProofTreeView.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java index 8de525bfcc..6ce0e4b75d 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java @@ -654,13 +654,11 @@ void selectBranchNode(GUIBranchNode node) { proofListener.ignoreNodeSelectionChange = false; TreePath tp = new TreePath(node.getPath()); treeSelectionListener.ignoreChange = true; + delegateModel.storeSelection(delegateView.getSelectionPath()); delegateView.getSelectionModel().setSelectionPath(tp); delegateView.scrollPathToVisible(tp); delegateView.validate(); treeSelectionListener.ignoreChange = false; - - delegateModel.storeSelection(delegateView.getSelectionPath()); - } public void showSearchPanel() { @@ -689,7 +687,8 @@ public boolean setFilter(ProofTreeViewFilter filter, boolean selected) { return false; } - final TreePath selectedPath = delegateModel.getSelection(); + final TreePath selectedPath = delegateView.getSelectionPath(); + if (selectedPath == null) { return false; } @@ -697,7 +696,6 @@ public boolean setFilter(ProofTreeViewFilter filter, boolean selected) { // Save expansion state to restore. List rowsToExpand = new ArrayList<>(expansionState); - final TreePath branch; final Node invokedNode; if (selectedPath.getLastPathComponent() instanceof GUIProofTreeNode) { @@ -943,7 +941,6 @@ public void valueChanged(TreeSelectionEvent e) { TreePath newTP = e.getNewLeadSelectionPath(); delegateModel.storeSelection(newTP); - if (treeNode.getNode().proof().isDisposed()) { setProof(null); return; From 049ac6d7155443cfa3a3d5521b0de34aeb5f4eb4 Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Fri, 1 Dec 2023 11:50:21 +0100 Subject: [PATCH 21/66] Store ProofTreeViewSettings per proof outside model and restore all settings upon switching --- .../key/gui/prooftree/GUIProofTreeModel.java | 13 -- .../ilkd/key/gui/prooftree/ProofTreeView.java | 117 ++++++++++++------ 2 files changed, 78 insertions(+), 52 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java index e2493edc28..9a59ac18b0 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java @@ -17,7 +17,6 @@ import org.key_project.util.collection.ImmutableList; -import org.jspecify.annotations.NonNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -513,18 +512,6 @@ public GUIBranchNode getBranchNode(Node n, Object label) { } } - - /** stores exactly the paths that are expanded in the proof tree */ - private @NonNull Collection expansionState = Collections.emptySet(); - - public void setExpansionState(@NonNull Collection c) { - expansionState = c; - } - - public @NonNull Collection getExpansionState() { - return expansionState; - } - TreePath selection; public void storeSelection(TreePath t) { diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java index 6ce0e4b75d..965c63a170 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java @@ -38,6 +38,7 @@ import de.uka.ilkd.key.proof.reference.ClosedBy; import de.uka.ilkd.key.rule.RuleApp; import de.uka.ilkd.key.settings.ProofIndependentSettings; +import de.uka.ilkd.key.util.Pair; import de.uka.ilkd.key.util.ThreadUtilities; import org.key_project.util.collection.ImmutableList; @@ -102,13 +103,9 @@ public class ProofTreeView extends JPanel implements TabPanel { private KeYMediator mediator; /** - * Stores for each loaded proof the GUI tree model. + * Stores for each loaded proof the view state */ - private final WeakHashMap models = new WeakHashMap<>(20); - /** - * Stores for each loaded proof the position of the scroll view. - */ - private final WeakHashMap scrollState = new WeakHashMap<>(); + private final WeakHashMap viewStates = new WeakHashMap<>(20); /** * The (currently selected) proof this view shows. @@ -463,37 +460,58 @@ public boolean selectBelow() { * @param p the Proof that has been loaded */ private void setProof(Proof p) { - if (proof != null) { - // save old scroll height - JScrollPane scroller = (JScrollPane) delegateView.getParent().getParent(); - scrollState.put(proof, scroller.getVerticalScrollBar().getValue()); - } if (proof == p) { return; // proof is already loaded } - ProofTreeViewFilter.NodeFilter filter = null; - if (delegateModel != null) { - filter = delegateModel.getActiveNodeFilter(); - expansionState.disconnect(); - delegateModel.setExpansionState(expansionState.copyState()); - delegateModel.storeSelection(delegateView.getSelectionPath()); - delegateModel.unregister(); - delegateModel.removeTreeModelListener(proofTreeSearchPanel); + + if (proof != null) { + // save old view state + JScrollPane scroller = (JScrollPane) delegateView.getParent().getParent(); + if (delegateModel != null) { // is it ever not null when proof != null? + var nodeFilter = delegateModel.getActiveNodeFilter(); + expansionState.disconnect(); + + final HashSet activeFilters = new HashSet<>(); + for (ProofTreeViewFilter f : ProofTreeViewFilter.ALL) { + if (f.isActive()) { + activeFilters.add(f); + } + } + + ProofTreeViewState memorizeProofTreeViewState = new ProofTreeViewState( + delegateModel, + expansionState.copyState(), + delegateView.getSelectionPath(), + activeFilters, + new Pair<>(nodeFilter, nodeFilter != null && nodeFilter.isActive()), + scroller.getVerticalScrollBar().getValue()); + + viewStates.put(proof, memorizeProofTreeViewState); + + delegateModel.unregister(); + delegateModel.removeTreeModelListener(proofTreeSearchPanel); + } + + } proof = p; if (proof != null) { - delegateModel = models.get(p); - if (delegateModel == null) { - delegateModel = new GUIProofTreeModel(p); - models.put(p, delegateModel); + ProofTreeViewState memorizedState = viewStates.get(proof); + + if (memorizedState == null) { + memorizedState = new ProofTreeViewState(new GUIProofTreeModel(p), + Collections.emptyList(), null, new HashSet<>(), + new Pair<>(null, false), 0); } + + delegateModel = memorizedState.model; delegateModel.addTreeModelListener(proofTreeSearchPanel); delegateModel.register(); delegateView.setModel(delegateModel); expansionState = - new ProofTreeExpansionState(delegateView, delegateModel.getExpansionState()); + new ProofTreeExpansionState(delegateView, memorizedState.expansionState); delegateView.expandRow(0); // Save expansion state to restore: @@ -505,18 +523,15 @@ private void setProof(Proof p) { } Collections.sort(rowsToExpand); - // Redraw the tree in case the ProofTreeViewFilters have changed - // since the last time the proof was loaded. - delegateModel.setFilter(filter, filter != null && filter.isActive()); // Expand previously visible rows. for (int i : rowsToExpand) { delegateView.expandRow(i); } - if (delegateModel.getSelection() != null) { - delegateView.setSelectionPath(delegateModel.getSelection()); - delegateView.scrollPathToVisible(delegateModel.getSelection()); + if (memorizedState.selectionPath != null) { + delegateView.setSelectionPath(memorizedState.selectionPath); + delegateView.scrollPathToVisible(memorizedState.selectionPath); } else { if (mediator.getSelectedProof() == p && mediator.getSelectedNode() != null) { makeNodeVisible(mediator.getSelectedNode()); @@ -528,10 +543,20 @@ private void setProof(Proof p) { // Restore previous scroll position. JScrollPane scroller = (JScrollPane) delegateView.getParent().getParent(); - Integer i = scrollState.get(proof); + Integer i = memorizedState.scrollState; if (i != null) { scroller.getVerticalScrollBar().setValue(i); } + + // restore filters + for (var viewFilter : ProofTreeViewFilter.ALL) { + setFilter(viewFilter, + memorizedState.activeFilters.contains(viewFilter)); + } + + delegateModel.setFilter(memorizedState.nodeFilterState.first, + memorizedState.nodeFilterState.second); + } else { delegateModel = null; delegateView @@ -539,18 +564,11 @@ private void setProof(Proof p) { expansionState = null; } proofTreeSearchPanel.reset(); - - for (ProofTreeViewFilter f : ProofTreeViewFilter.ALL) { - if (f.isActive()) { - setFilter(f, true); - } - } } public void removeProofs(Proof[] ps) { for (final Proof p : ps) { - models.remove(p); - scrollState.remove(p); + viewStates.remove(p); mediator.getCurrentlyOpenedProofs().remove(p); } } @@ -1283,4 +1301,25 @@ public Node getSelectedNode() { ? ((GUIAbstractTreeNode) treeNode).getNode() : null; } + + + /** + * Record used to store the state of the proof tree view for a particular proof such that it can + * be stored and + * restored when switching proofs + * + * @param model the {@link GUIProofTreeModel} of the proof + * @param expansionState the expanded tree paths + * @param selectionPath the path to the currently selected node + * @param activeFilters the activated {@link ProofTreeViewFilter}s + * @param nodeFilterState the activated (if any) {@link ProofTreeViewFilter.NodeFilter} + * @param scrollState the state of the scroll pane + */ + record ProofTreeViewState(GUIProofTreeModel model, + Collection expansionState, + TreePath selectionPath, + HashSet activeFilters, + Pair nodeFilterState, + Integer scrollState) { + } } From 7dcd7db7376262984dd8267bcb6bcb923019d8be Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Fri, 1 Dec 2023 12:10:40 +0100 Subject: [PATCH 22/66] Restore correct node selection and remove unused fields from GUIProofTreeModel --- .../key/gui/prooftree/GUIProofTreeModel.java | 10 ----- .../ilkd/key/gui/prooftree/ProofTreeView.java | 38 +++++++++---------- 2 files changed, 17 insertions(+), 31 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java index 9a59ac18b0..505462d341 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java @@ -512,16 +512,6 @@ public GUIBranchNode getBranchNode(Node n, Object label) { } } - TreePath selection; - - public void storeSelection(TreePath t) { - selection = t; - } - - public TreePath getSelection() { - return selection; - } - public NodeFilter getActiveNodeFilter() { return activeNodeFilter; } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java index 965c63a170..19a5037c64 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java @@ -491,8 +491,6 @@ private void setProof(Proof p) { delegateModel.unregister(); delegateModel.removeTreeModelListener(proofTreeSearchPanel); } - - } proof = p; @@ -524,6 +522,23 @@ private void setProof(Proof p) { Collections.sort(rowsToExpand); + + // Restore previous scroll position. + JScrollPane scroller = (JScrollPane) delegateView.getParent().getParent(); + Integer scrollState = memorizedState.scrollState; + if (scrollState != null) { + scroller.getVerticalScrollBar().setValue(scrollState); + } + + // restore filters + for (var viewFilter : ProofTreeViewFilter.ALL) { + setFilter(viewFilter, + memorizedState.activeFilters.contains(viewFilter)); + } + + delegateModel.setFilter(memorizedState.nodeFilterState.first, + memorizedState.nodeFilterState.second); + // Expand previously visible rows. for (int i : rowsToExpand) { delegateView.expandRow(i); @@ -540,23 +555,6 @@ private void setProof(Proof p) { delegateView.setSelectionRow(1); } } - - // Restore previous scroll position. - JScrollPane scroller = (JScrollPane) delegateView.getParent().getParent(); - Integer i = memorizedState.scrollState; - if (i != null) { - scroller.getVerticalScrollBar().setValue(i); - } - - // restore filters - for (var viewFilter : ProofTreeViewFilter.ALL) { - setFilter(viewFilter, - memorizedState.activeFilters.contains(viewFilter)); - } - - delegateModel.setFilter(memorizedState.nodeFilterState.first, - memorizedState.nodeFilterState.second); - } else { delegateModel = null; delegateView @@ -672,7 +670,6 @@ void selectBranchNode(GUIBranchNode node) { proofListener.ignoreNodeSelectionChange = false; TreePath tp = new TreePath(node.getPath()); treeSelectionListener.ignoreChange = true; - delegateModel.storeSelection(delegateView.getSelectionPath()); delegateView.getSelectionModel().setSelectionPath(tp); delegateView.scrollPathToVisible(tp); delegateView.validate(); @@ -957,7 +954,6 @@ public void valueChanged(TreeSelectionEvent e) { } TreePath newTP = e.getNewLeadSelectionPath(); - delegateModel.storeSelection(newTP); if (treeNode.getNode().proof().isDisposed()) { setProof(null); From ffd3f480e57938cb377e8c985b3cec0eef492ccf Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Fri, 1 Dec 2023 13:56:12 +0100 Subject: [PATCH 23/66] Fix node filter selection display in popup dialoh and some refactoring --- .../key/gui/prooftree/GUIProofTreeModel.java | 8 +- .../ilkd/key/gui/prooftree/ProofTreeView.java | 81 ++++++++----------- 2 files changed, 40 insertions(+), 49 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java index 505462d341..6508c75a0f 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java @@ -263,13 +263,17 @@ public boolean globalFilterActive() { */ public synchronized void setFilter(ProofTreeViewFilter filter, boolean active) { if (filter == null) { - activeNodeFilter = null; + if (activeNodeFilter != null) { + activeNodeFilter.setActive(false); + activeNodeFilter = null; + } updateTree((TreeNode) null); return; } if (!filter.global()) { - if (activeNodeFilter != null) + if (activeNodeFilter != null) { activeNodeFilter.setActive(false); + } activeNodeFilter = active ? (NodeFilter) filter : null; } filter.setActive(active); diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java index 19a5037c64..f9d601ef62 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java @@ -474,6 +474,8 @@ private void setProof(Proof p) { final HashSet activeFilters = new HashSet<>(); for (ProofTreeViewFilter f : ProofTreeViewFilter.ALL) { if (f.isActive()) { + // ignore node filters as only one might be active at a given time + // their state is saved independently activeFilters.add(f); } } @@ -488,6 +490,9 @@ private void setProof(Proof p) { viewStates.put(proof, memorizeProofTreeViewState); + if (nodeFilter != null) { + delegateModel.setFilter(nodeFilter, false); + } delegateModel.unregister(); delegateModel.removeTreeModelListener(proofTreeSearchPanel); } @@ -713,66 +718,34 @@ public boolean setFilter(ProofTreeViewFilter filter, boolean selected) { final TreePath branch; final Node invokedNode; - if (selectedPath.getLastPathComponent() instanceof GUIProofTreeNode) { + if (selectedPath.getLastPathComponent() instanceof GUIProofTreeNode guiNode) { branch = selectedPath.getParentPath(); - invokedNode = - ((GUIProofTreeNode) selectedPath.getLastPathComponent()).getNode(); + invokedNode = guiNode.getNode(); } else { branch = selectedPath; invokedNode = ((GUIBranchNode) selectedPath.getLastPathComponent()).getNode(); } + delegateModel.setFilter(filter, selected); + if (!filter.global()) { - delegateModel.setFilter(filter, selected); if (branch == selectedPath) { - if (delegateModel.getRoot() instanceof GUIBranchNode) { - TreeNode node = ((GUIAbstractTreeNode) delegateModel.getRoot()) - .findBranch(invokedNode); - if (node instanceof GUIBranchNode) { - selectBranchNode((GUIBranchNode) node); - } - } + selectedNodeIsBranchNode(invokedNode); } else { delegateView.scrollPathToVisible(selectedPath); delegateView.setSelectionPath(selectedPath); } + } else if (branch == selectedPath && + (!selected || invokedNode.parent() == null || + delegateModel + .getProofTreeNode(invokedNode.parent()) + .findChild(invokedNode.parent()) == null)) { + selectedNodeIsBranchNode(invokedNode); } else { - delegateModel.setFilter(filter, selected); - if (branch == selectedPath) { - if (!selected) { - if (delegateModel.getRoot() instanceof GUIBranchNode) { - TreeNode node = ((GUIAbstractTreeNode) delegateModel.getRoot()) - .findBranch(invokedNode); - if (node instanceof GUIBranchNode) { - selectBranchNode((GUIBranchNode) node); - } - } - } else { - if (invokedNode.parent() == null || delegateModel - .getProofTreeNode(invokedNode.parent()) - .findChild(invokedNode.parent()) == null) { - // it's still a branch - if (delegateModel.getRoot() instanceof GUIBranchNode) { - TreeNode node = - ((GUIAbstractTreeNode) delegateModel.getRoot()) - .findBranch(invokedNode); - if (node instanceof GUIBranchNode) { - selectBranchNode((GUIBranchNode) node); - } - } - } else { - TreePath tp = new TreePath(delegateModel - .getProofTreeNode(invokedNode).getPath()); - delegateView.scrollPathToVisible(tp); - delegateView.setSelectionPath(tp); - } - } - } else { - TreePath tp = new TreePath( - delegateModel.getProofTreeNode(invokedNode).getPath()); - delegateView.scrollPathToVisible(tp); - delegateView.setSelectionPath(tp); - } + final TreePath tp = new TreePath(delegateModel + .getProofTreeNode(invokedNode).getPath()); + delegateView.scrollPathToVisible(tp); + delegateView.setSelectionPath(tp); } // Expand previously visible rows. @@ -788,6 +761,20 @@ public boolean setFilter(ProofTreeViewFilter filter, boolean selected) { return true; } + /** + * if invoked node is modelled as branch node, select the branch node + * + * @param invokedNode the selected node in the proof + */ + private void selectedNodeIsBranchNode(Node invokedNode) { + if (delegateModel.getRoot() instanceof GUIBranchNode rootNode) { + final TreeNode node = rootNode.findBranch(invokedNode); + if (node instanceof GUIBranchNode childAsBranchNode) { + selectBranchNode(childAsBranchNode); + } + } + } + @NonNull @Override public Collection getTitleCActions() { From 7dc28a2921aea38f00b02fff1eec5735196fb536 Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Fri, 1 Dec 2023 14:39:50 +0100 Subject: [PATCH 24/66] Fix problem with closed subtree filter --- .../ilkd/key/gui/prooftree/GUIBranchNode.java | 59 ++++--------------- .../ilkd/key/gui/prooftree/ProofTreeView.java | 9 +++ .../uka/ilkd/key/proof/io/ProblemLoader.java | 4 +- 3 files changed, 25 insertions(+), 47 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIBranchNode.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIBranchNode.java index bff237c986..e66df61c63 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIBranchNode.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIBranchNode.java @@ -6,6 +6,7 @@ * this class implements a TreeModel that can be displayed using the JTree class framework */ +import java.util.ArrayList; import javax.swing.tree.TreeNode; import de.uka.ilkd.key.proof.Node; @@ -16,22 +17,17 @@ class GUIBranchNode extends GUIAbstractTreeNode implements TreeNode { private final Object label; + private ArrayList childrenCache = null; + + public GUIBranchNode(GUIProofTreeModel tree, Node subTree, Object label) { super(tree, subTree); this.label = label; } - - private TreeNode[] childrenCache = null; - - private void createChildrenCache() { - childrenCache = new TreeNode[getChildCountHelp()]; - } - public TreeNode getChildAt(int childIndex) { - fillChildrenCache(); - return childrenCache[childIndex]; - + ensureChildrenCacheExists(); + return childrenCache.get(childIndex); /* * int count = 0; Node n = subTree; while ( childIndex != count && n.childrenCount() == 1 ) * { count++; n = n.child(0); } if ( childIndex == count ) { return getProofTreeModel @@ -39,12 +35,10 @@ public TreeNode getChildAt(int childIndex) { */ } - private void fillChildrenCache() { + private void ensureChildrenCacheExists() { if (childrenCache == null) { - createChildrenCache(); - } - - if (childrenCache.length == 0 || childrenCache[0] != null) { + childrenCache = new ArrayList<>(); + } else { return; } @@ -56,7 +50,7 @@ private void fillChildrenCache() { } while (true) { - childrenCache[count] = getProofTreeModel().getProofTreeNode(n); + childrenCache.add(count, getProofTreeModel().getProofTreeNode(n)); count++; final Node nextN = findChild(n); if (nextN == null) { @@ -67,7 +61,7 @@ private void fillChildrenCache() { for (int i = 0; i != n.childrenCount(); ++i) { if (!ProofTreeViewFilter.hiddenByGlobalFilters(n.child(i))) { - childrenCache[count] = findBranch(n.child(i)); + childrenCache.add(count, findBranch(n.child(i))); count++; } } @@ -86,38 +80,11 @@ public String getSearchString() { public int getChildCount() { if (childrenCache == null) { - createChildrenCache(); - } - return childrenCache.length; - } - - private int getChildCountHelp() { - int count = 0; - Node n = getNode(); - - if (n == null) { - return 0; + ensureChildrenCacheExists(); } - - while (true) { - count++; - final Node nextN = findChild(n); - if (nextN == null) { - break; - } - n = nextN; - } - - for (int i = 0; i != n.childrenCount(); ++i) { - if (!ProofTreeViewFilter.hiddenByGlobalFilters(n.child(i))) { - count++; - } - } - - return count; + return childrenCache.size(); } - public TreeNode getParent() { Node self = getNode(); if (self == null) { diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java index f9d601ef62..e5c10687f2 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java @@ -535,6 +535,15 @@ private void setProof(Proof p) { scroller.getVerticalScrollBar().setValue(scrollState); } + + // this selection must happen before and later after restoring the filters + // as setting a filter immediately applies it and + if (memorizedState.selectionPath != null) { + delegateView.setSelectionPath(memorizedState.selectionPath); + } else { + delegateView.setSelectionRow(0); + } + // restore filters for (var viewFilter : ProofTreeViewFilter.ALL) { setFilter(viewFilter, diff --git a/key.ui/src/main/java/de/uka/ilkd/key/proof/io/ProblemLoader.java b/key.ui/src/main/java/de/uka/ilkd/key/proof/io/ProblemLoader.java index f66f262519..1f4e9b9133 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/proof/io/ProblemLoader.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/proof/io/ProblemLoader.java @@ -143,7 +143,9 @@ protected void done() { mediator.getUI().reportStatus(this, errorMessage); } fireTaskFinished(runTime, message); - mediator.getSelectionModel().defaultSelection(); + if (mediator.getSelectedProof() != null) { + mediator.getSelectionModel().defaultSelection(); + } } } }; From 3337a5cb6df6756c4845fed555efafc4ec242dee Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Fri, 1 Dec 2023 16:54:34 +0100 Subject: [PATCH 25/66] Minor clean up to slightly simplify complexity of path selection in ProofTreeView --- .../gui/prooftree/ProofTreePopupFactory.java | 12 +++- .../key/gui/prooftree/ProofTreeSearchBar.java | 9 +-- .../ilkd/key/gui/prooftree/ProofTreeView.java | 57 ++++++++----------- 3 files changed, 39 insertions(+), 39 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreePopupFactory.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreePopupFactory.java index c12df26cb5..ac7fcd0799 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreePopupFactory.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreePopupFactory.java @@ -300,7 +300,11 @@ public void actionPerformed(ActionEvent e) { } } if (sibling instanceof GUIBranchNode) { - context.proofTreeView.selectBranchNode((GUIBranchNode) sibling); + var tp = context.proofTreeView.selectBranchNode((GUIBranchNode) sibling); + if (tp != null) { + context.delegateView.setSelectionPath(tp); + context.delegateView.scrollPathToVisible(tp); + } } } } @@ -333,7 +337,11 @@ public void actionPerformed(ActionEvent e) { } } if (sibling instanceof GUIBranchNode) { - context.proofTreeView.selectBranchNode((GUIBranchNode) sibling); + var tp = context.proofTreeView.selectBranchNode((GUIBranchNode) sibling); + if (tp != null) { + context.delegateView.setSelectionPath(tp); + context.delegateView.scrollPathToVisible(tp); + } } } } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeSearchBar.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeSearchBar.java index 17035b07d7..f90def1f60 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeSearchBar.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeSearchBar.java @@ -71,11 +71,12 @@ private synchronized boolean search(String searchString, Position.Bias direction tp = new TreePath(node.getPath()); } if (node instanceof GUIBranchNode) { - this.proofTreeView.selectBranchNode((GUIBranchNode) node); - } else { - this.proofTreeView.delegateView.scrollPathToVisible(tp); - this.proofTreeView.delegateView.setSelectionPath(tp); + tp = this.proofTreeView.selectBranchNode((GUIBranchNode) node); } + + this.proofTreeView.delegateView.scrollPathToVisible(tp); + this.proofTreeView.delegateView.setSelectionPath(tp); + return currentRow != -1; } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java index e5c10687f2..38eea03f35 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java @@ -526,8 +526,6 @@ private void setProof(Proof p) { } Collections.sort(rowsToExpand); - - // Restore previous scroll position. JScrollPane scroller = (JScrollPane) delegateView.getParent().getParent(); Integer scrollState = memorizedState.scrollState; @@ -535,7 +533,6 @@ private void setProof(Proof p) { scroller.getVerticalScrollBar().setValue(scrollState); } - // this selection must happen before and later after restoring the filters // as setting a filter immediately applies it and if (memorizedState.selectionPath != null) { @@ -597,7 +594,6 @@ public void makeNodeVisible(Node n) { if (node == null) { return; } - TreeNode[] obs = node.getPath(); TreePath tp = new TreePath(obs); treeSelectionListener.ignoreChange = true; @@ -675,19 +671,14 @@ private void collapseOthersHelp(TreePath start, TreePath stop) { * Selects the given Branchnode in the ProofTreeView and displays the first child in the main * view. */ - void selectBranchNode(GUIBranchNode node) { + TreePath selectBranchNode(GUIBranchNode node) { if (node == null) { - return; + return null; } proofListener.ignoreNodeSelectionChange = true; mediator.getSelectionModel().setSelectedNode(node.getNode()); proofListener.ignoreNodeSelectionChange = false; - TreePath tp = new TreePath(node.getPath()); - treeSelectionListener.ignoreChange = true; - delegateView.getSelectionModel().setSelectionPath(tp); - delegateView.scrollPathToVisible(tp); - delegateView.validate(); - treeSelectionListener.ignoreChange = false; + return new TreePath(node.getPath()); } public void showSearchPanel() { @@ -716,7 +707,7 @@ public boolean setFilter(ProofTreeViewFilter filter, boolean selected) { return false; } - final TreePath selectedPath = delegateView.getSelectionPath(); + TreePath selectedPath = delegateView.getSelectionPath(); if (selectedPath == null) { return false; @@ -737,26 +728,21 @@ public boolean setFilter(ProofTreeViewFilter filter, boolean selected) { delegateModel.setFilter(filter, selected); - if (!filter.global()) { - if (branch == selectedPath) { - selectedNodeIsBranchNode(invokedNode); - } else { - delegateView.scrollPathToVisible(selectedPath); - delegateView.setSelectionPath(selectedPath); - } + if (!filter.global() && branch == selectedPath) { + selectedPath = getPathForBranchNode(invokedNode, selectedPath); } else if (branch == selectedPath && (!selected || invokedNode.parent() == null || delegateModel .getProofTreeNode(invokedNode.parent()) .findChild(invokedNode.parent()) == null)) { - selectedNodeIsBranchNode(invokedNode); + selectedPath = getPathForBranchNode(invokedNode, selectedPath); } else { - final TreePath tp = new TreePath(delegateModel - .getProofTreeNode(invokedNode).getPath()); - delegateView.scrollPathToVisible(tp); - delegateView.setSelectionPath(tp); + selectedPath = new TreePath(delegateModel.getProofTreeNode(invokedNode).getPath()); } + delegateView.setSelectionPath(selectedPath); + delegateView.scrollPathToVisible(selectedPath); + // Expand previously visible rows. for (TreePath tp : rowsToExpand) { TreePath newTp = delegateView.getPathForRow(0); @@ -774,14 +760,17 @@ public boolean setFilter(ProofTreeViewFilter filter, boolean selected) { * if invoked node is modelled as branch node, select the branch node * * @param invokedNode the selected node in the proof + * @param defaultPath the {@link TreePath} to be returned if the invokedNode does not have an associated branch node + * @return the path to the branch node if available otherwise {@code defaultPath} */ - private void selectedNodeIsBranchNode(Node invokedNode) { + private TreePath getPathForBranchNode(Node invokedNode, TreePath defaultPath) { if (delegateModel.getRoot() instanceof GUIBranchNode rootNode) { final TreeNode node = rootNode.findBranch(invokedNode); if (node instanceof GUIBranchNode childAsBranchNode) { - selectBranchNode(childAsBranchNode); + return selectBranchNode(childAsBranchNode); } } + return defaultPath; } @NonNull @@ -955,8 +944,9 @@ public void valueChanged(TreeSelectionEvent e) { setProof(null); return; } + if (treeNode instanceof GUIBranchNode) { - selectBranchNode((GUIBranchNode) treeNode); + newTP = selectBranchNode((GUIBranchNode) treeNode); } else { Node node = treeNode.getNode(); Goal selected = proof.getOpenGoal(node); @@ -972,15 +962,16 @@ public void valueChanged(TreeSelectionEvent e) { .replaceFormula(ossNode.getFormulaNr(), pio.sequentFormula()).sequent(); mediator.getSelectionModel().setSelectedSequentAndRuleApp( ossParentNode.getNode(), modifiedSequent, ossNode.getRuleApp()); - - // ensure the proper node is selected in the tree - ignoreChange = true; - delegateView.setSelectionPath(newTP); - ignoreChange = false; } else { mediator.nonGoalNodeChosen(node); } } + // ensure the proper node is selected in the tree + if (newTP != null && !newTP.equals(e.getNewLeadSelectionPath())) { + ignoreChange = true; + delegateView.setSelectionPath(newTP); + ignoreChange = false; + } } } From dac555cd0a3bf330beddb1ceffe9558ac137f9d8 Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Fri, 1 Dec 2023 19:58:43 +0100 Subject: [PATCH 26/66] MainWindow updates sequent view after settings change for pretty printing --- key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java | 2 +- .../de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java | 2 +- .../main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java index c183cfe70a..971f32bfbe 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java @@ -831,6 +831,7 @@ public void makePrettyView() { getMediator().getNotationInfo().refresh(mediator.getServices()); getMediator().getSelectedProof().fireProofGoalsChanged(); } + SwingUtilities.invokeLater(this::updateSequentView); } private void addToProofList(de.uka.ilkd.key.proof.ProofAggregate plist) { @@ -1791,5 +1792,4 @@ public void selectedNodeChanged(KeYSelectionEvent e) { public void setSequentView(SequentView sequentView) { sequentViewSearchBar.setSequentView(sequentView); } - } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java index 25a584fbaf..7273876aea 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java @@ -7,7 +7,7 @@ import java.awt.event.ActionEvent; import java.beans.PropertyChangeListener; import java.util.EventObject; -import javax.swing.JCheckBoxMenuItem; +import javax.swing.*; import de.uka.ilkd.key.gui.MainWindow; import de.uka.ilkd.key.pp.NotationInfo; diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java index 38eea03f35..dffff7b00a 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java @@ -760,7 +760,8 @@ public boolean setFilter(ProofTreeViewFilter filter, boolean selected) { * if invoked node is modelled as branch node, select the branch node * * @param invokedNode the selected node in the proof - * @param defaultPath the {@link TreePath} to be returned if the invokedNode does not have an associated branch node + * @param defaultPath the {@link TreePath} to be returned if the invokedNode does not have an + * associated branch node * @return the path to the branch node if available otherwise {@code defaultPath} */ private TreePath getPathForBranchNode(Node invokedNode, TreePath defaultPath) { From 12f43d241bee0a25a45afa6143f9ff92218af568 Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Sat, 2 Dec 2023 08:33:24 +0100 Subject: [PATCH 27/66] USe refactorings from #3369 but preserve non-local filter semantics for proof tree view --- .../ilkd/key/gui/prooftree/ProofTreeView.java | 81 ++++++------------- 1 file changed, 26 insertions(+), 55 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java index dffff7b00a..60ea08d8ab 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java @@ -38,7 +38,6 @@ import de.uka.ilkd.key.proof.reference.ClosedBy; import de.uka.ilkd.key.rule.RuleApp; import de.uka.ilkd.key.settings.ProofIndependentSettings; -import de.uka.ilkd.key.util.Pair; import de.uka.ilkd.key.util.ThreadUtilities; import org.key_project.util.collection.ImmutableList; @@ -404,8 +403,8 @@ public boolean selectAbove() { int row = delegateView.getRowForPath(path); row--; while (delegateView.getPathForRow(row) != null) { - TreePath tp = delegateView.getPathForRow(row); - var treeNode = (GUIAbstractTreeNode) tp.getLastPathComponent(); + final TreePath tp = delegateView.getPathForRow(row); + final var treeNode = (GUIAbstractTreeNode) tp.getLastPathComponent(); if (treeNode instanceof GUIBranchNode && treeNode.getNode().parent() != null && treeNode.getNode().parent().childrenCount() > 1 && !delegateView.isExpanded(tp)) { @@ -464,35 +463,22 @@ private void setProof(Proof p) { return; // proof is already loaded } + ProofTreeViewFilter.NodeFilter previousNodeFilter = null; + boolean previousNodeFilterState = false; if (proof != null) { // save old view state - JScrollPane scroller = (JScrollPane) delegateView.getParent().getParent(); if (delegateModel != null) { // is it ever not null when proof != null? - var nodeFilter = delegateModel.getActiveNodeFilter(); + JScrollPane scroller = (JScrollPane) delegateView.getParent().getParent(); expansionState.disconnect(); - - final HashSet activeFilters = new HashSet<>(); - for (ProofTreeViewFilter f : ProofTreeViewFilter.ALL) { - if (f.isActive()) { - // ignore node filters as only one might be active at a given time - // their state is saved independently - activeFilters.add(f); - } - } - + previousNodeFilter = delegateModel.getActiveNodeFilter(); + previousNodeFilterState = + previousNodeFilter != null && previousNodeFilter.isActive(); ProofTreeViewState memorizeProofTreeViewState = new ProofTreeViewState( delegateModel, expansionState.copyState(), delegateView.getSelectionPath(), - activeFilters, - new Pair<>(nodeFilter, nodeFilter != null && nodeFilter.isActive()), scroller.getVerticalScrollBar().getValue()); - viewStates.put(proof, memorizeProofTreeViewState); - - if (nodeFilter != null) { - delegateModel.setFilter(nodeFilter, false); - } delegateModel.unregister(); delegateModel.removeTreeModelListener(proofTreeSearchPanel); } @@ -504,9 +490,8 @@ private void setProof(Proof p) { ProofTreeViewState memorizedState = viewStates.get(proof); if (memorizedState == null) { - memorizedState = new ProofTreeViewState(new GUIProofTreeModel(p), - Collections.emptyList(), null, new HashSet<>(), - new Pair<>(null, false), 0); + memorizedState = new ProofTreeViewState(new GUIProofTreeModel(proof), + Collections.emptyList(), null, 0); } delegateModel = memorizedState.model; @@ -526,35 +511,15 @@ private void setProof(Proof p) { } Collections.sort(rowsToExpand); - // Restore previous scroll position. - JScrollPane scroller = (JScrollPane) delegateView.getParent().getParent(); - Integer scrollState = memorizedState.scrollState; - if (scrollState != null) { - scroller.getVerticalScrollBar().setValue(scrollState); - } - - // this selection must happen before and later after restoring the filters - // as setting a filter immediately applies it and - if (memorizedState.selectionPath != null) { - delegateView.setSelectionPath(memorizedState.selectionPath); - } else { - delegateView.setSelectionRow(0); - } - // restore filters for (var viewFilter : ProofTreeViewFilter.ALL) { - setFilter(viewFilter, - memorizedState.activeFilters.contains(viewFilter)); + setFilter(viewFilter, viewFilter.isActive()); } - delegateModel.setFilter(memorizedState.nodeFilterState.first, - memorizedState.nodeFilterState.second); - - // Expand previously visible rows. - for (int i : rowsToExpand) { - delegateView.expandRow(i); - } + // restore node filter + delegateModel.setFilter(previousNodeFilter, previousNodeFilterState); + // restore selection if (memorizedState.selectionPath != null) { delegateView.setSelectionPath(memorizedState.selectionPath); delegateView.scrollPathToVisible(memorizedState.selectionPath); @@ -566,6 +531,18 @@ private void setProof(Proof p) { delegateView.setSelectionRow(1); } } + + // Expand previously visible rows. + for (int i : rowsToExpand) { + delegateView.expandRow(i); + } + + // Restore previous scroll position. + JScrollPane scroller = (JScrollPane) delegateView.getParent().getParent(); + Integer scrollState = memorizedState.scrollState; + if (scrollState != null) { + scroller.getVerticalScrollBar().setValue(scrollState); + } } else { delegateModel = null; delegateView @@ -589,7 +566,6 @@ public void makeNodeVisible(Node n) { if (n == null) { return; } - final GUIAbstractTreeNode node = delegateModel.getProofTreeNode(n); if (node == null) { return; @@ -1286,7 +1262,6 @@ public Node getSelectedNode() { : null; } - /** * Record used to store the state of the proof tree view for a particular proof such that it can * be stored and @@ -1295,15 +1270,11 @@ public Node getSelectedNode() { * @param model the {@link GUIProofTreeModel} of the proof * @param expansionState the expanded tree paths * @param selectionPath the path to the currently selected node - * @param activeFilters the activated {@link ProofTreeViewFilter}s - * @param nodeFilterState the activated (if any) {@link ProofTreeViewFilter.NodeFilter} * @param scrollState the state of the scroll pane */ record ProofTreeViewState(GUIProofTreeModel model, Collection expansionState, TreePath selectionPath, - HashSet activeFilters, - Pair nodeFilterState, Integer scrollState) { } } From ef9bbec5f78b6787461e11251d4d77f4b177a6b4 Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Sat, 2 Dec 2023 10:45:37 +0100 Subject: [PATCH 28/66] Remove duplicate update of sequentview --- key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java index 971f32bfbe..40cf80717b 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java @@ -829,7 +829,6 @@ public void unfreezeExceptAutoModeButton() { public void makePrettyView() { if (getMediator().ensureProofLoaded()) { getMediator().getNotationInfo().refresh(mediator.getServices()); - getMediator().getSelectedProof().fireProofGoalsChanged(); } SwingUtilities.invokeLater(this::updateSequentView); } @@ -1726,7 +1725,6 @@ public synchronized void selectedProofChanged(KeYSelectionEvent e) { } disableCurrentGoalView = false; - SwingUtilities.invokeLater(MainWindow.this::updateSequentView); makePrettyView(); } From d939bcfe2772a10cbc2d5656ead68d6de20078d7 Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Sat, 2 Dec 2023 11:17:24 +0100 Subject: [PATCH 29/66] Reduce number of sequentview updates Each view setting update caused it own redraw even if itself did not change. --- .../actions/HidePackagePrefixToggleAction.java | 15 ++++++--------- .../key/gui/actions/PrettyPrintToggleAction.java | 14 ++++++++------ .../ilkd/key/gui/actions/UnicodeToggleAction.java | 10 ++++++---- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java index d0a6c1dba2..242fe272ba 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java @@ -4,8 +4,8 @@ package de.uka.ilkd.key.gui.actions; import java.awt.event.ActionEvent; +import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.util.EventObject; import javax.swing.*; import de.uka.ilkd.key.gui.MainWindow; @@ -55,16 +55,13 @@ public void actionPerformed(ActionEvent e) { // the UI will react on the settings // change event! ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().setHidePackagePrefix(selected); - updateMainWindow(); } - private void updateMainWindow() { - mainWindow.makePrettyView(); - } - - private void handleViewSettingsChanged(EventObject e) { - updateSelectedState(); - updateMainWindow(); + private void handleViewSettingsChanged(PropertyChangeEvent e) { + if (NAME.equals(e.getPropertyName())) { + updateSelectedState(); + mainWindow.makePrettyView(); + } } } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java index 7273876aea..8f2dea8c77 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java @@ -5,8 +5,8 @@ import java.awt.event.ActionEvent; +import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.util.EventObject; import javax.swing.*; import de.uka.ilkd.key.gui.MainWindow; @@ -67,10 +67,12 @@ protected void updateMainWindow(boolean prettySyntax) { mainWindow.makePrettyView(); } - protected void handleViewSettingsChanged(EventObject e) { - updateSelectedState(); - final boolean prettySyntax = - ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().isUsePretty(); - updateMainWindow(prettySyntax); + protected void handleViewSettingsChanged(PropertyChangeEvent e) { + if (NAME.equals(e.getPropertyName())) { + updateSelectedState(); + final boolean prettySyntax = + ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().isUsePretty(); + updateMainWindow(prettySyntax); + } } } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java index 213a751ec8..41a5632e8e 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java @@ -4,8 +4,8 @@ package de.uka.ilkd.key.gui.actions; import java.awt.event.ActionEvent; +import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.util.EventObject; import javax.swing.JCheckBoxMenuItem; import de.uka.ilkd.key.gui.MainWindow; @@ -71,8 +71,10 @@ protected void updateMainWindow() { mainWindow.makePrettyView(); } - protected void handleViewSettingsChanged(EventObject e) { - updateSelectedState(); - updateMainWindow(); + protected void handleViewSettingsChanged(PropertyChangeEvent e) { + if (NAME.equals(e.getPropertyName())) { + updateSelectedState(); + updateMainWindow(); + } } } From ee57f337f57aeccb5c3d45c7c81ed416cdc46556 Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Sat, 2 Dec 2023 13:13:01 +0100 Subject: [PATCH 30/66] Make usage of PropertyChangeListeners working (addendum to previous commit) --- .../uka/ilkd/key/settings/ViewSettings.java | 8 +++---- .../HidePackagePrefixToggleAction.java | 7 +++--- .../gui/actions/PrettyPrintToggleAction.java | 10 +++------ .../SyntaxHighlightingToggleAction.java | 22 ++++++++++++++++++- .../key/gui/actions/UnicodeToggleAction.java | 6 ++--- 5 files changed, 35 insertions(+), 18 deletions(-) diff --git a/key.core/src/main/java/de/uka/ilkd/key/settings/ViewSettings.java b/key.core/src/main/java/de/uka/ilkd/key/settings/ViewSettings.java index 09bcadfa5e..506f3be7f7 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/settings/ViewSettings.java +++ b/key.core/src/main/java/de/uka/ilkd/key/settings/ViewSettings.java @@ -78,22 +78,22 @@ public class ViewSettings extends AbstractPropertiesSettings { /** * Pretty Syntax is true by default, use Unicode symbols not */ - private static final String PRETTY_SYNTAX = "PrettySyntax"; + public static final String PRETTY_SYNTAX = "PrettySyntax"; /** * */ - private static final String USE_UNICODE = "UseUnicodeSymbols"; + public static final String USE_UNICODE = "UseUnicodeSymbols"; /** * */ - private static final String SYNTAX_HIGHLIGHTING = "SyntaxHighlighting"; + public static final String SYNTAX_HIGHLIGHTING = "SyntaxHighlighting"; /** * */ - private static final String HIDE_PACKAGE_PREFIX = "HidePackagePrefix"; + public static final String HIDE_PACKAGE_PREFIX = "HidePackagePrefix"; /** * confirm exiting by default diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java index 242fe272ba..30dcac2d02 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java @@ -11,6 +11,7 @@ import de.uka.ilkd.key.gui.MainWindow; import de.uka.ilkd.key.pp.NotationInfo; import de.uka.ilkd.key.settings.ProofIndependentSettings; +import de.uka.ilkd.key.settings.ViewSettings; public final class HidePackagePrefixToggleAction extends MainWindowAction { public static final String NAME = "Hide Package Prefix"; @@ -36,7 +37,7 @@ public HidePackagePrefixToggleAction(MainWindow mainWindow) { // removed, because there is only one // MainWindow! ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings() - .addPropertyChangeListener(viewSettingsListener); + .addPropertyChangeListener(ViewSettings.HIDE_PACKAGE_PREFIX, viewSettingsListener); updateSelectedState(); } @@ -57,8 +58,8 @@ public void actionPerformed(ActionEvent e) { ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().setHidePackagePrefix(selected); } - private void handleViewSettingsChanged(PropertyChangeEvent e) { - if (NAME.equals(e.getPropertyName())) { + protected void handleViewSettingsChanged(PropertyChangeEvent e) { + if (ViewSettings.HIDE_PACKAGE_PREFIX.equals(e.getPropertyName())) { updateSelectedState(); mainWindow.makePrettyView(); } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java index 8f2dea8c77..da885e019d 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java @@ -12,6 +12,7 @@ import de.uka.ilkd.key.gui.MainWindow; import de.uka.ilkd.key.pp.NotationInfo; import de.uka.ilkd.key.settings.ProofIndependentSettings; +import de.uka.ilkd.key.settings.ViewSettings; public class PrettyPrintToggleAction extends MainWindowAction { public static final String NAME = "Use Pretty Syntax"; @@ -25,9 +26,6 @@ public class PrettyPrintToggleAction extends MainWindowAction { /** * Listens for changes on {@code ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings()}. - *

- * Such changes can occur in the Eclipse context when settings are changed in for instance the - * KeYIDE. */ private final PropertyChangeListener viewSettingsListener = this::handleViewSettingsChanged; @@ -39,7 +37,7 @@ public PrettyPrintToggleAction(MainWindow mainWindow) { // removed, because there is only one // MainWindow! ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings() - .addPropertyChangeListener(viewSettingsListener); + .addPropertyChangeListener(ViewSettings.PRETTY_SYNTAX, viewSettingsListener); updateSelectedState(); } @@ -48,7 +46,6 @@ protected void updateSelectedState() { ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().isUsePretty(); NotationInfo.DEFAULT_PRETTY_SYNTAX = prettySyntax; setSelected(prettySyntax); - // setSelected(NotationInfo.PRETTY_SYNTAX); } @Override @@ -58,7 +55,6 @@ public void actionPerformed(ActionEvent e) { // will react on the settings change event! NotationInfo.DEFAULT_PRETTY_SYNTAX = selected; ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().setUsePretty(selected); - updateMainWindow(selected); } protected void updateMainWindow(boolean prettySyntax) { @@ -68,7 +64,7 @@ protected void updateMainWindow(boolean prettySyntax) { } protected void handleViewSettingsChanged(PropertyChangeEvent e) { - if (NAME.equals(e.getPropertyName())) { + if (ViewSettings.PRETTY_SYNTAX.equals(e.getPropertyName())) { updateSelectedState(); final boolean prettySyntax = ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().isUsePretty(); diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/SyntaxHighlightingToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/SyntaxHighlightingToggleAction.java index c0a6241677..8af6f19c21 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/SyntaxHighlightingToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/SyntaxHighlightingToggleAction.java @@ -4,14 +4,24 @@ package de.uka.ilkd.key.gui.actions; import java.awt.event.ActionEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import javax.swing.JCheckBoxMenuItem; import de.uka.ilkd.key.gui.MainWindow; import de.uka.ilkd.key.settings.ProofIndependentSettings; +import static de.uka.ilkd.key.settings.ViewSettings.SYNTAX_HIGHLIGHTING; + public class SyntaxHighlightingToggleAction extends MainWindowAction { private static final long serialVersionUID = 6987252955535709994L; + /** + * Listens for changes on {@code ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings()}. + */ + private final PropertyChangeListener syntaxHighlightingListener = + this::handleViewSettingsChanged; + public SyntaxHighlightingToggleAction(MainWindow window) { super(window); setName("Use Syntax Highlighting"); @@ -20,6 +30,11 @@ public SyntaxHighlightingToggleAction(MainWindow window) { + "slow down the rendering of longer ones."); final boolean useSyntaxHighlighting = ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().isUseSyntaxHighlighting(); + // Attention: The listener is never + // removed, because there is only one + // MainWindow! + ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings() + .addPropertyChangeListener(SYNTAX_HIGHLIGHTING, syntaxHighlightingListener); setSelected(useSyntaxHighlighting); } @@ -28,7 +43,12 @@ public void actionPerformed(ActionEvent e) { boolean useSyntaxHighlighting = ((JCheckBoxMenuItem) e.getSource()).isSelected(); ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings() .setUseSyntaxHighlighting(useSyntaxHighlighting); - mainWindow.makePrettyView(); + setSelected(useSyntaxHighlighting); } + protected void handleViewSettingsChanged(PropertyChangeEvent e) { + if (SYNTAX_HIGHLIGHTING.equals(e.getPropertyName())) { + mainWindow.makePrettyView(); + } + } } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java index 41a5632e8e..7346ebf4b9 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java @@ -11,6 +11,7 @@ import de.uka.ilkd.key.gui.MainWindow; import de.uka.ilkd.key.pp.NotationInfo; import de.uka.ilkd.key.settings.ProofIndependentSettings; +import de.uka.ilkd.key.settings.ViewSettings; import de.uka.ilkd.key.util.UnicodeHelper; public class UnicodeToggleAction extends MainWindowAction { @@ -38,7 +39,7 @@ public UnicodeToggleAction(MainWindow window) { // Attention: The listener is never// removed, because there is only one // MainWindow! ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings() - .addPropertyChangeListener(viewSettingsListener); + .addPropertyChangeListener(ViewSettings.USE_UNICODE, viewSettingsListener); updateSelectedState(); } @@ -64,7 +65,6 @@ public void actionPerformed(ActionEvent e) { // UI will react on the // settings change event! ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().setUseUnicode(useUnicode); - updateMainWindow(); } protected void updateMainWindow() { @@ -72,7 +72,7 @@ protected void updateMainWindow() { } protected void handleViewSettingsChanged(PropertyChangeEvent e) { - if (NAME.equals(e.getPropertyName())) { + if (ViewSettings.USE_UNICODE.equals(e.getPropertyName())) { updateSelectedState(); updateMainWindow(); } From 29027cd7a4e6b686de8e795f177ad382d9a53812 Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Sat, 2 Dec 2023 13:24:06 +0100 Subject: [PATCH 31/66] Remove unnecessary checks for correct change as listener is now registered correctly only for changes of interest --- .../key/gui/actions/HidePackagePrefixToggleAction.java | 6 ++---- .../ilkd/key/gui/actions/PrettyPrintToggleAction.java | 10 ++++------ .../gui/actions/SyntaxHighlightingToggleAction.java | 4 +--- .../uka/ilkd/key/gui/actions/UnicodeToggleAction.java | 6 ++---- 4 files changed, 9 insertions(+), 17 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java index 30dcac2d02..ef96eaf860 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java @@ -59,10 +59,8 @@ public void actionPerformed(ActionEvent e) { } protected void handleViewSettingsChanged(PropertyChangeEvent e) { - if (ViewSettings.HIDE_PACKAGE_PREFIX.equals(e.getPropertyName())) { - updateSelectedState(); - mainWindow.makePrettyView(); - } + updateSelectedState(); + mainWindow.makePrettyView(); } } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java index da885e019d..357e31ac19 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java @@ -64,11 +64,9 @@ protected void updateMainWindow(boolean prettySyntax) { } protected void handleViewSettingsChanged(PropertyChangeEvent e) { - if (ViewSettings.PRETTY_SYNTAX.equals(e.getPropertyName())) { - updateSelectedState(); - final boolean prettySyntax = - ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().isUsePretty(); - updateMainWindow(prettySyntax); - } + updateSelectedState(); + final boolean prettySyntax = + ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().isUsePretty(); + updateMainWindow(prettySyntax); } } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/SyntaxHighlightingToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/SyntaxHighlightingToggleAction.java index 8af6f19c21..03654fa2d1 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/SyntaxHighlightingToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/SyntaxHighlightingToggleAction.java @@ -47,8 +47,6 @@ public void actionPerformed(ActionEvent e) { } protected void handleViewSettingsChanged(PropertyChangeEvent e) { - if (SYNTAX_HIGHLIGHTING.equals(e.getPropertyName())) { - mainWindow.makePrettyView(); - } + mainWindow.makePrettyView(); } } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java index 7346ebf4b9..e5a3b0c1c4 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java @@ -72,9 +72,7 @@ protected void updateMainWindow() { } protected void handleViewSettingsChanged(PropertyChangeEvent e) { - if (ViewSettings.USE_UNICODE.equals(e.getPropertyName())) { - updateSelectedState(); - updateMainWindow(); - } + updateSelectedState(); + updateMainWindow(); } } From c78c1f98467be01d884ddeb239873841d1bfc49a Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Fri, 8 Dec 2023 22:25:59 +0100 Subject: [PATCH 32/66] Fix selection highlight for OSS node child This commit fixes also exceptions when activating a filter like "Hide Closed Subtrees" when an OSS child node was selected. --- .../uka/ilkd/key/core/KeYSelectionModel.java | 2 +- .../ilkd/key/gui/prooftree/GUIBranchNode.java | 6 +-- .../ilkd/key/gui/prooftree/ProofTreeView.java | 39 ++++++++++++++++--- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/core/KeYSelectionModel.java b/key.ui/src/main/java/de/uka/ilkd/key/core/KeYSelectionModel.java index cf18650a59..b3a72e3f86 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/core/KeYSelectionModel.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/core/KeYSelectionModel.java @@ -149,7 +149,7 @@ public synchronized void setSelectedSequentAndRuleApp(Node node, Sequent sequent selectedNode = node; selectedSequent = sequent; selectedRuleApp = ruleApp; - fireSelectedNodeChanged(node); + fireSelectedNodeChanged(previousNode); } /** diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIBranchNode.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIBranchNode.java index e66df61c63..0aeac640d2 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIBranchNode.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIBranchNode.java @@ -2,9 +2,6 @@ * KeY is licensed under the GNU General Public License Version 2 * SPDX-License-Identifier: GPL-2.0-only */ package de.uka.ilkd.key.gui.prooftree; -/** - * this class implements a TreeModel that can be displayed using the JTree class framework - */ import java.util.ArrayList; import javax.swing.tree.TreeNode; @@ -13,6 +10,9 @@ import org.jspecify.annotations.NonNull; +/** + * this class implements a TreeModel that can be displayed using the JTree class framework + */ class GUIBranchNode extends GUIAbstractTreeNode implements TreeNode { private final Object label; diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java index 60ea08d8ab..56c2c23c85 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java @@ -32,6 +32,7 @@ import de.uka.ilkd.key.gui.keyshortcuts.KeyStrokeManager; import de.uka.ilkd.key.java.Services; import de.uka.ilkd.key.logic.PosInOccurrence; +import de.uka.ilkd.key.logic.Sequent; import de.uka.ilkd.key.pp.LogicPrinter; import de.uka.ilkd.key.pp.PrettyPrinter; import de.uka.ilkd.key.proof.*; @@ -570,7 +571,25 @@ public void makeNodeVisible(Node n) { if (node == null) { return; } + TreeNode[] obs = node.getPath(); + + if (n.sequent() != mediator.getSelectionModel().getSelectedSequent()) { + // in this case we have to select a child of an OSS node + ArrayList pathToOSSChild = new ArrayList<>(); + pathToOSSChild.addAll(Arrays.asList(obs)); + for (int i = 0; i Date: Fri, 8 Dec 2023 22:39:05 +0100 Subject: [PATCH 33/66] Spotless cleanups --- .../ilkd/key/gui/prooftree/ProofTreeView.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java index 56c2c23c85..d0361823e1 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java @@ -32,7 +32,6 @@ import de.uka.ilkd.key.gui.keyshortcuts.KeyStrokeManager; import de.uka.ilkd.key.java.Services; import de.uka.ilkd.key.logic.PosInOccurrence; -import de.uka.ilkd.key.logic.Sequent; import de.uka.ilkd.key.pp.LogicPrinter; import de.uka.ilkd.key.pp.PrettyPrinter; import de.uka.ilkd.key.proof.*; @@ -578,10 +577,10 @@ public void makeNodeVisible(Node n) { // in this case we have to select a child of an OSS node ArrayList pathToOSSChild = new ArrayList<>(); pathToOSSChild.addAll(Arrays.asList(obs)); - for (int i = 0; i Date: Sat, 9 Dec 2023 05:22:55 +0100 Subject: [PATCH 34/66] bug fixes * change API: JPanel is the return argument for SettingsProvider * new flag for restart-requiring features * make BULK_UI_TEST feature hot-loadable --- .../ilkd/key/settings/FeatureSettings.java | 38 ++++++++++++++++--- key.ui/build.gradle | 2 +- .../java/de/uka/ilkd/key/gui/MainWindow.java | 19 ++++++++-- .../key/gui/colors/ColorSettingsProvider.java | 2 +- .../key/gui/extension/ExtensionManager.java | 2 +- .../key/gui/extension/impl/HeatmapExt.java | 2 +- .../key/gui/extension/impl/TestExtension.java | 6 ++- .../gui/keyshortcuts/ShortcutSettings.java | 2 +- .../caching/CachingSettingsProvider.java | 2 +- .../gui/settings/DefaultSettingsProvider.java | 8 ++-- .../gui/settings/FeatureSettingsPanel.java | 17 ++++++++- .../key/gui/settings/SettingsProvider.java | 2 +- .../uka/ilkd/key/gui/settings/SettingsUi.java | 2 +- .../key/gui/settings/StandardUISettings.java | 2 +- .../gui/settings/TacletOptionsSettings.java | 2 +- .../smt/settings/NewTranslationOptions.java | 2 +- .../gui/smt/settings/SMTSettingsProvider.java | 2 +- .../key/gui/smt/settings/SolverOptions.java | 2 +- .../settings/TacletTranslationOptions.java | 2 +- .../gui/smt/settings/TranslationOptions.java | 5 ++- .../slicing/SlicingSettingsProvider.java | 2 +- .../key/gui/testgen/TestgenOptionsPanel.java | 2 +- 22 files changed, 91 insertions(+), 34 deletions(-) diff --git a/key.core/src/main/java/de/uka/ilkd/key/settings/FeatureSettings.java b/key.core/src/main/java/de/uka/ilkd/key/settings/FeatureSettings.java index 96d3a47bc0..b63849ed32 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/settings/FeatureSettings.java +++ b/key.core/src/main/java/de/uka/ilkd/key/settings/FeatureSettings.java @@ -24,6 +24,7 @@ public class FeatureSettings extends AbstractSettings { private static final Logger LOGGER = LoggerFactory.getLogger(FeatureSettings.class); private static final String CATEGORY = "Feature"; + /** * unstored, set by {@code --experimental} */ @@ -57,6 +58,17 @@ public static void on(Feature feature, Consumer update) { feature.id, evt -> update.accept((Boolean) evt.getNewValue())); } + /** + * Helper function for notification on feature flag changes which also calls the consumer. + * + * @param feature the feature to be listening on + * @param update a callback function which gets informed on changes with the new value + */ + public static void onAndActivate(Feature feature, Consumer update) { + on(feature, update); + update.accept(isFeatureActivated(feature)); + } + /** * Use the system properties ({@code -P FEATURE:XXX=true} to activate a feature from the command * line. @@ -130,24 +142,36 @@ private boolean isActivated(String id) { return activatedFeatures.contains(id); } + /** + * Activates the given feature {@code f}. + */ public void activate(Feature f) { activate(f.id); } + /** + * Activates the given feature by {@code id}. + */ private void activate(String id) { if (!isActivated(id)) { activatedFeatures.add(id); - firePropertyChange(id, false, true); + firePropertyChange(id, false, isActivated(id)); } } + /** + * Deactivates the given feature {@code f}. + */ public void deactivate(Feature f) { deactivate(f.id); } + /** + * Deactivates the given feature by {@code id}. + */ private void deactivate(String id) { if (isActivated(id)) { - firePropertyChange(id, true, false); + firePropertyChange(id, true, isActivated(id)); activatedFeatures.remove(id); } } @@ -161,14 +185,18 @@ public boolean isActivateAll() { } public static Feature createFeature(String id) { - return new Feature(id, ""); + return createFeature(id, "", true); } public static Feature createFeature(String id, String doc) { - return new Feature(id, doc); + return new Feature(id, doc, true); + } + + public static Feature createFeature(String id, String doc, boolean restartRequired) { + return new Feature(id, doc, restartRequired); } - public record Feature(String id, String documentation) { + public record Feature(String id, String documentation, boolean restartRequired) { public static final List FEATURES = new ArrayList<>(); public Feature { diff --git a/key.ui/build.gradle b/key.ui/build.gradle index 797afdfac3..7b7c8771d5 100644 --- a/key.ui/build.gradle +++ b/key.ui/build.gradle @@ -63,7 +63,7 @@ run { systemProperties["key.examples.dir"] = "$projectDir/examples" //systemProperties["slf4j.detectLoggerNameMismatch"] = true //systemProperties["KeyDebugFlag"] = "on" - //args "--experimental" + args "--experimental" // this can be used to solve a problem where the OS hangs during debugging of popup menus // (see https://docs.oracle.com/javase/10/troubleshoot/awt.htm#JSTGD425) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java index 610c5230ad..7b9d1be3a0 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java @@ -15,6 +15,7 @@ import java.lang.reflect.Method; import java.util.*; import java.util.List; +import java.util.function.Consumer; import java.util.function.Function; import java.util.prefs.BackingStoreException; import java.util.prefs.Preferences; @@ -78,7 +79,6 @@ import org.slf4j.LoggerFactory; import static de.uka.ilkd.key.settings.FeatureSettings.createFeature; -import static de.uka.ilkd.key.settings.FeatureSettings.isFeatureActivated; @HelpInfo() public final class MainWindow extends JFrame { @@ -102,7 +102,8 @@ public final class MainWindow extends JFrame { private static final Logger LOGGER = LoggerFactory.getLogger(MainWindow.class); private static final FeatureSettings.Feature FEATURE_BULK_UI_TEST = createFeature( "BULK_UI_TEST", - "Activates the 'Run All Proofs' action that allows you to run multiple proofs inside the UI."); + "Activates the 'Run All Proofs' action that allows you to run multiple proofs inside the UI.", + false); private static MainWindow instance = null; /** @@ -893,10 +894,20 @@ private JMenu createFileMenu() { submenu.add(loadUserDefinedTacletsForProvingAction); submenu.add(loadKeYTaclets); submenu.add(lemmaGenerationBatchModeAction); - if (isFeatureActivated(FEATURE_BULK_UI_TEST)) { + + { RunAllProofsAction runAllProofsAction = new RunAllProofsAction(this); - submenu.add(runAllProofsAction); + var rapItem = new JMenuItem(runAllProofsAction); + final Consumer showRAPAction = active -> { + if (active) { + submenu.add(rapItem); + } else { + submenu.remove(rapItem); + } + }; + FeatureSettings.onAndActivate(FEATURE_BULK_UI_TEST, showRAPAction); } + fileMenu.addSeparator(); fileMenu.add(recentFileMenu.getMenu()); fileMenu.addSeparator(); diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/colors/ColorSettingsProvider.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/colors/ColorSettingsProvider.java index 6dae2505c2..e0818cbf7e 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/colors/ColorSettingsProvider.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/colors/ColorSettingsProvider.java @@ -42,7 +42,7 @@ public String getDescription() { } @Override - public JComponent getPanel(MainWindow window) { + public JPanel getPanel(MainWindow window) { List properties = ColorSettings.getInstance().getProperties() .map(it -> new ColorPropertyData(it, it.get())).collect(Collectors.toList()); diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/extension/ExtensionManager.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/extension/ExtensionManager.java index eb1ea8a83d..f02f98ead0 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/extension/ExtensionManager.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/extension/ExtensionManager.java @@ -117,7 +117,7 @@ public String getDescription() { } @Override - public JComponent getPanel(MainWindow window) { + public JPanel getPanel(MainWindow window) { refresh(); return this; } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/extension/impl/HeatmapExt.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/extension/impl/HeatmapExt.java index 15eadae231..807ecb748c 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/extension/impl/HeatmapExt.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/extension/impl/HeatmapExt.java @@ -193,7 +193,7 @@ public String getDescription() { } @Override - public JComponent getPanel(MainWindow window) { + public JPanel getPanel(MainWindow window) { final ViewSettings vs = ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings(); for (Map.Entry entry : map.entrySet()) { HeatmapMode mode = entry.getKey(); diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/extension/impl/TestExtension.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/extension/impl/TestExtension.java index f2a34130ab..549aedbd1d 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/extension/impl/TestExtension.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/extension/impl/TestExtension.java @@ -147,8 +147,10 @@ public String getDescription() { } @Override - public JComponent getPanel(MainWindow window) { - return new JLabel("Test"); + public JPanel getPanel(MainWindow window) { + JPanel p = new JPanel(); + p.add(new JLabel("Test")); + return p; } @Override diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/keyshortcuts/ShortcutSettings.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/keyshortcuts/ShortcutSettings.java index 1dc26a2ab9..fe0a410f61 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/keyshortcuts/ShortcutSettings.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/keyshortcuts/ShortcutSettings.java @@ -44,7 +44,7 @@ public String getDescription() { } @Override - public JComponent getPanel(MainWindow window) { + public JPanel getPanel(MainWindow window) { KeyStrokeSettings settings = KeyStrokeManager.getSettings(); Properties p = new Properties(); settings.writeSettings(p); diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/plugins/caching/CachingSettingsProvider.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/plugins/caching/CachingSettingsProvider.java index 0c29d39778..544e392b3b 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/plugins/caching/CachingSettingsProvider.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/plugins/caching/CachingSettingsProvider.java @@ -73,7 +73,7 @@ public static ProofCachingSettings getCachingSettings() { } @Override - public JComponent getPanel(MainWindow window) { + public JPanel getPanel(MainWindow window) { ProofCachingSettings ss = getCachingSettings(); strategySearch.setSelected(ss.getEnabled()); disposeOption.setSelectedItem(ss.getDispose()); diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/DefaultSettingsProvider.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/DefaultSettingsProvider.java index 7e5938dac2..3b95072d1e 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/DefaultSettingsProvider.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/DefaultSettingsProvider.java @@ -14,7 +14,7 @@ */ public class DefaultSettingsProvider implements SettingsProvider { private String description; - private JComponent panel; + private JPanel panel; private List children; private final String keywords = ""; private int priority; @@ -23,7 +23,7 @@ public class DefaultSettingsProvider implements SettingsProvider { public DefaultSettingsProvider() { } - public DefaultSettingsProvider(String desc, JComponent pane) { + public DefaultSettingsProvider(String desc, JPanel pane) { setDescription(desc); setPanel(pane); } @@ -38,7 +38,7 @@ public void setDescription(String description) { } @Override - public JComponent getPanel(MainWindow window) { + public JPanel getPanel(MainWindow window) { return panel; } @@ -74,7 +74,7 @@ public int getPriorityOfSettings() { return priority; } - public void setPanel(JComponent panel) { + public void setPanel(JPanel panel) { this.panel = panel; } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/FeatureSettingsPanel.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/FeatureSettingsPanel.java index f05722d206..9cf15adb69 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/FeatureSettingsPanel.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/FeatureSettingsPanel.java @@ -16,7 +16,7 @@ * @version 1 (04.12.23) */ public class FeatureSettingsPanel extends SettingsPanel implements SettingsProvider { - private Map checkboxes = new IdentityHashMap<>(); + private final Map checkboxes = new IdentityHashMap<>(); public FeatureSettingsPanel() { setHeaderText("Feature Flags"); @@ -29,7 +29,7 @@ public String getDescription() { } @Override - public JComponent getPanel(MainWindow window) { + public JPanel getPanel(MainWindow window) { pCenter.removeAll(); // start fresh checkboxes.clear(); var fs = ProofIndependentSettings.DEFAULT_INSTANCE.getFeatureSettings(); @@ -44,14 +44,27 @@ public JComponent getPanel(MainWindow window) { @Override public void applySettings(MainWindow window) throws InvalidSettingsInputException { var fs = ProofIndependentSettings.DEFAULT_INSTANCE.getFeatureSettings(); + var showMessageReloadRequired = false; for (var entry : checkboxes.entrySet()) { var activate = entry.getValue().isSelected(); var feature = entry.getKey(); + var reloadRequired = feature.restartRequired(); + final var activeBefore = fs.isActivated(feature); if (activate) fs.activate(feature); else fs.deactivate(feature); + + final var activeAfter = fs.isActivated(feature); + if (activeBefore != activeAfter) { + showMessageReloadRequired |= reloadRequired; + } + } + + if (showMessageReloadRequired) { + JOptionPane.showMessageDialog(this, + "A reload of KeY is required due to changed features."); } } } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/SettingsProvider.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/SettingsProvider.java index b50ce4edcf..02936f6fbf 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/SettingsProvider.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/SettingsProvider.java @@ -40,7 +40,7 @@ public interface SettingsProvider { * @param window non-null reference * @return */ - JComponent getPanel(MainWindow window); + JPanel getPanel(MainWindow window); /** * Tree children of your settings dialog. diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/SettingsUi.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/SettingsUi.java index c750a6fcf0..7f7b4f00b7 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/SettingsUi.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/SettingsUi.java @@ -162,7 +162,7 @@ public int setSettingsProvider(List providers) { } return all.stream(); }).map(x -> { - JPanel panel = (JPanel) x.getPanel(mainWindow); + JPanel panel = x.getPanel(mainWindow); setSettingsPanel(panel); frame.pack(); return panel.getWidth(); diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/StandardUISettings.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/StandardUISettings.java index f523c45e3b..9075e9f186 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/StandardUISettings.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/StandardUISettings.java @@ -141,7 +141,7 @@ public String getDescription() { } @Override - public JComponent getPanel(MainWindow window) { + public JPanel getPanel(MainWindow window) { ViewSettings vs = ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings(); GeneralSettings generalSettings = ProofIndependentSettings.DEFAULT_INSTANCE.getGeneralSettings(); diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/TacletOptionsSettings.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/TacletOptionsSettings.java index 4429744d19..9ffa6aee27 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/TacletOptionsSettings.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/settings/TacletOptionsSettings.java @@ -290,7 +290,7 @@ public String getDescription() { } @Override - public JComponent getPanel(MainWindow window) { + public JPanel getPanel(MainWindow window) { warnNoProof = window.getMediator().getSelectedProof() == null; setChoiceSettings(SettingsManager.getChoiceSettings(window)); return this; diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/NewTranslationOptions.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/NewTranslationOptions.java index 719e6d44c4..4e640f1560 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/NewTranslationOptions.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/NewTranslationOptions.java @@ -68,7 +68,7 @@ public String getDescription() { } @Override - public JComponent getPanel(MainWindow window) { + public JPanel getPanel(MainWindow window) { NewSMTTranslationSettings newSMTSettings = SettingsManager.getNewSmtSettings(window); SetVisitor visitor = new SetVisitor(); for (JComponent component : components) { diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/SMTSettingsProvider.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/SMTSettingsProvider.java index 29ee4ff713..1cb00ad3d7 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/SMTSettingsProvider.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/SMTSettingsProvider.java @@ -168,7 +168,7 @@ public String getDescription() { } @Override - public JComponent getPanel(MainWindow window) { + public JPanel getPanel(MainWindow window) { ProofIndependentSMTSettings pi = SettingsManager.getSmtPiSettings(); setSmtSettings(pi.clone()); return this; diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/SolverOptions.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/SolverOptions.java index baea011a54..fdeff38fe1 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/SolverOptions.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/SolverOptions.java @@ -176,7 +176,7 @@ public String getDescription() { } @Override - public JComponent getPanel(MainWindow window) { + public JPanel getPanel(MainWindow window) { setSmtSettings(SettingsManager.getSmtPiSettings().clone()); return this; } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/TacletTranslationOptions.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/TacletTranslationOptions.java index 1d8b92aab8..ff0dde1701 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/TacletTranslationOptions.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/TacletTranslationOptions.java @@ -63,7 +63,7 @@ public String getDescription() { } @Override - public JComponent getPanel(MainWindow window) { + public JPanel getPanel(MainWindow window) { ProofDependentSMTSettings pdSettings = SettingsManager.getSmtPdSettings(window).clone(); ProofIndependentSMTSettings piSettings = SettingsManager.getSmtPiSettings().clone(); maxNumberOfGenerics.setValue(pdSettings.getMaxGenericSorts()); diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/TranslationOptions.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/TranslationOptions.java index fe288302f1..35cf06d5eb 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/TranslationOptions.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/settings/TranslationOptions.java @@ -135,6 +135,9 @@ protected JSpinner createMaxField() { settings.setMaxInteger(e.longValue()); } long result = 0; + if (maxField == null) { + return; + } try { result = (long) maxField.getValue(); maxField.setForeground(Color.BLACK); @@ -166,7 +169,7 @@ public String getDescription() { } @Override - public JComponent getPanel(MainWindow window) { + public JPanel getPanel(MainWindow window) { setSmtSettings(SettingsManager.getSmtPdSettings(window).clone()); return this; } diff --git a/keyext.slicing/src/main/java/org/key_project/slicing/SlicingSettingsProvider.java b/keyext.slicing/src/main/java/org/key_project/slicing/SlicingSettingsProvider.java index 271bfcd81a..ad5c4ac189 100644 --- a/keyext.slicing/src/main/java/org/key_project/slicing/SlicingSettingsProvider.java +++ b/keyext.slicing/src/main/java/org/key_project/slicing/SlicingSettingsProvider.java @@ -96,7 +96,7 @@ public static SlicingSettings getSlicingSettings() { } @Override - public JComponent getPanel(MainWindow window) { + public JPanel getPanel(MainWindow window) { SlicingSettings ss = getSlicingSettings(); alwaysTrack.setSelected(ss.getAlwaysTrack()); dotExecutable.setText(ss.getDotExecutable()); diff --git a/keyext.ui.testgen/src/main/java/de/uka/ilkd/key/gui/testgen/TestgenOptionsPanel.java b/keyext.ui.testgen/src/main/java/de/uka/ilkd/key/gui/testgen/TestgenOptionsPanel.java index 85415e4f08..886cae4000 100644 --- a/keyext.ui.testgen/src/main/java/de/uka/ilkd/key/gui/testgen/TestgenOptionsPanel.java +++ b/keyext.ui.testgen/src/main/java/de/uka/ilkd/key/gui/testgen/TestgenOptionsPanel.java @@ -158,7 +158,7 @@ public String getDescription() { } @Override - public JComponent getPanel(MainWindow window) { + public JPanel getPanel(MainWindow window) { settings = new TestGenerationSettings(TestGenerationSettings.getInstance()); includePostCondition.setSelected(settings.includePostCondition()); invariantForAll.setSelected(settings.invariantForAll()); From 01b5f1d3af907a2f3c426e8399379eb7e8f2fa8a Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Sun, 10 Dec 2023 06:28:18 +0100 Subject: [PATCH 35/66] Configurable enabled keys for JML condition evaluation --- .../ilkd/key/settings/GeneralSettings.java | 47 ++++++++++++++++++- .../key/speclang/njml/JmlMarkerDecision.java | 3 +- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/key.core/src/main/java/de/uka/ilkd/key/settings/GeneralSettings.java b/key.core/src/main/java/de/uka/ilkd/key/settings/GeneralSettings.java index 74dbbb5c0f..ab4cdd39d3 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/settings/GeneralSettings.java +++ b/key.core/src/main/java/de/uka/ilkd/key/settings/GeneralSettings.java @@ -3,10 +3,15 @@ * SPDX-License-Identifier: GPL-2.0-only */ package de.uka.ilkd.key.settings; -import java.util.Properties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; public class GeneralSettings extends AbstractSettings { + private static final Logger LOGGER = LoggerFactory.getLogger(GeneralSettings.class); + /** * This parameter disables the possibility to prune in closed branches. It is meant as a * fallback solution if storing all closed goals needs too much memory or is not needed. Pruning @@ -32,6 +37,9 @@ public class GeneralSettings extends AbstractSettings { private static final String TACLET_FILTER = "StupidMode"; private static final String DND_DIRECTION_SENSITIVE_KEY = "DnDDirectionSensitive"; private static final String USE_JML_KEY = "UseJML"; + + private static final String KEY_JML_ENABLED_KEYS = "JML_ENABLED_KEYS"; + private static final String RIGHT_CLICK_MACROS_KEY = "RightClickMacros"; private static final String AUTO_SAVE = "AutoSavePeriod"; @@ -40,6 +48,8 @@ public class GeneralSettings extends AbstractSettings { */ private static final String ENSURE_SOURCE_CONSISTENCY = "EnsureSourceConsistency"; + private Set jmlEnabledKeys = new TreeSet<>(Set.of("key")); + /** * minimize interaction is on by default */ @@ -75,7 +85,16 @@ public class GeneralSettings extends AbstractSettings { // addSettingsListener(AutoSaver.settingsListener); } - // getter + public Set getJmlEnabledKeys() { + return jmlEnabledKeys; + } + + public void setJmlEnabledKeys(Set jmlEnabledKeys) { + var oldValue = this.jmlEnabledKeys; + this.jmlEnabledKeys = Objects.requireNonNull(jmlEnabledKeys); + firePropertyChange(KEY_JML_ENABLED_KEYS, oldValue, jmlEnabledKeys); + } + public boolean getTacletFilter() { return tacletFilter; } @@ -185,6 +204,20 @@ public void readSettings(Properties props) { if (val != null) { setEnsureSourceConsistency(Boolean.parseBoolean(val)); } + + { + var sysProp = System.getProperty(KEY_JML_ENABLED_KEYS); + if (sysProp != null) { + val = sysProp; + LOGGER.warn("Use system property -P{}={}", KEY_JML_ENABLED_KEYS, sysProp); + }else { + val = props.getProperty(prefix + KEY_JML_ENABLED_KEYS); + } + + if (val != null) { + setJmlEnabledKeys(new TreeSet<>(Arrays.stream(val.split(",")).toList())); + } + } } /** @@ -205,6 +238,7 @@ public void writeSettings(Properties props) { props.setProperty(prefix + AUTO_SAVE, String.valueOf(autoSave)); props.setProperty(prefix + ENSURE_SOURCE_CONSISTENCY, String.valueOf(ensureSourceConsistency)); + props.setProperty(KEY_JML_ENABLED_KEYS, String.join(",", jmlEnabledKeys)); } @Override @@ -222,6 +256,14 @@ public void readSettings(Configuration props) { setAutoSave(0); } setEnsureSourceConsistency(props.getBool(ENSURE_SOURCE_CONSISTENCY)); + + var sysProp = System.getProperty(KEY_JML_ENABLED_KEYS); + if (sysProp != null) { + LOGGER.warn("Use system property -P{}={}", KEY_JML_ENABLED_KEYS, sysProp); + setJmlEnabledKeys(new TreeSet<>(Arrays.stream(sysProp.split(",")).toList())); + }else { + setJmlEnabledKeys(new TreeSet<>(props.getStringList(KEY_JML_ENABLED_KEYS))); + } } @Override @@ -232,5 +274,6 @@ public void writeSettings(Configuration props) { props.set(USE_JML_KEY, useJML); props.set(AUTO_SAVE, autoSave); props.set(ENSURE_SOURCE_CONSISTENCY, ensureSourceConsistency); + props.set(KEY_JML_ENABLED_KEYS, jmlEnabledKeys.stream().toList()); } } diff --git a/key.core/src/main/java/de/uka/ilkd/key/speclang/njml/JmlMarkerDecision.java b/key.core/src/main/java/de/uka/ilkd/key/speclang/njml/JmlMarkerDecision.java index 1651ecfad6..126ec6ecf9 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/speclang/njml/JmlMarkerDecision.java +++ b/key.core/src/main/java/de/uka/ilkd/key/speclang/njml/JmlMarkerDecision.java @@ -9,6 +9,7 @@ import java.util.Set; import java.util.stream.Collectors; +import de.uka.ilkd.key.settings.ProofIndependentSettings; import org.jspecify.annotations.NonNull; /** @@ -29,7 +30,7 @@ public class JmlMarkerDecision { */ public JmlMarkerDecision(JmlLexer lexer) { this.lexer = lexer; - enabledKeys.add("key"); + setEnabledKeys(ProofIndependentSettings.DEFAULT_INSTANCE.getGeneralSettings().getJmlEnabledKeys()); } /** From 806ed6549a9ba491a71add37c7af5eb5671494f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 20:13:06 +0000 Subject: [PATCH 36/66] Bump com.miglayout:miglayout-swing from 11.2 to 11.3 Bumps [com.miglayout:miglayout-swing](https://github.com/mikaelgrev/miglayout) from 11.2 to 11.3. - [Release notes](https://github.com/mikaelgrev/miglayout/releases) - [Changelog](https://github.com/mikaelgrev/miglayout/blob/master/release.txt) - [Commits](https://github.com/mikaelgrev/miglayout/compare/v11.2...v11.3) --- updated-dependencies: - dependency-name: com.miglayout:miglayout-swing dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- key.ui/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/key.ui/build.gradle b/key.ui/build.gradle index 797afdfac3..000117e8ac 100644 --- a/key.ui/build.gradle +++ b/key.ui/build.gradle @@ -20,7 +20,7 @@ dependencies { implementation project(":key.core.symbolic_execution") implementation project(":key.removegenerics") - api 'com.miglayout:miglayout-swing:11.2' + api 'com.miglayout:miglayout-swing:11.3' //logging implementation used by the slf4j implementation 'ch.qos.logback:logback-classic:1.4.14' From a22b3d47d204a7f945fe75395dc93a805614875e Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Tue, 19 Dec 2023 09:24:47 +0100 Subject: [PATCH 37/66] Fix TestTermParser to avoid multiple parsing of declarations --- .../nparser/builder/DeclarationBuilder.java | 9 ++--- .../ilkd/key/util/parsing/BuildingIssue.java | 1 + .../uka/ilkd/key/parser/TestTermParser.java | 40 ++++++++++--------- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java index 475e36b719..90486ec375 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java @@ -18,14 +18,12 @@ import de.uka.ilkd.key.nparser.ParsingFacade; import de.uka.ilkd.key.rule.RuleSet; -import de.uka.ilkd.key.util.parsing.BuildingIssue; import org.key_project.util.collection.DefaultImmutableSet; import org.key_project.util.collection.ImmutableSet; import org.antlr.v4.runtime.Token; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import recoder.util.Debug; /** * This visitor evaluates all basic (level 0) declarations. This includes: @@ -159,11 +157,12 @@ public Object visitOne_sort_decl(KeYParser.One_sort_declContext ctx) { sorts().add(s); createdSorts.add(s); } else { - // weigl: agreement on KaKeY meeting: this should be ignored until we finally have local namespaces + // weigl: agreement on KaKeY meeting: this should be ignored until we finally have + // local namespaces // for generic sorts - //addWarning(ctx, "Sort declaration is ignored, due to collision."); + // addWarning(ctx, "Sort declaration is ignored, due to collision."); LOGGER.info("Sort declaration is ignored, due to collision in {}", - BuilderHelpers.getPosition(ctx)); + BuilderHelpers.getPosition(ctx)); } } return createdSorts; diff --git a/key.core/src/main/java/de/uka/ilkd/key/util/parsing/BuildingIssue.java b/key.core/src/main/java/de/uka/ilkd/key/util/parsing/BuildingIssue.java index d0945e1ce2..7bcc404913 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/util/parsing/BuildingIssue.java +++ b/key.core/src/main/java/de/uka/ilkd/key/util/parsing/BuildingIssue.java @@ -5,6 +5,7 @@ import java.net.URI; import java.net.URISyntaxException; + import de.uka.ilkd.key.java.Position; import de.uka.ilkd.key.parser.Location; import de.uka.ilkd.key.speclang.PositionedString; diff --git a/key.core/src/test/java/de/uka/ilkd/key/parser/TestTermParser.java b/key.core/src/test/java/de/uka/ilkd/key/parser/TestTermParser.java index 995705cf2b..ed0033f25b 100644 --- a/key.core/src/test/java/de/uka/ilkd/key/parser/TestTermParser.java +++ b/key.core/src/test/java/de/uka/ilkd/key/parser/TestTermParser.java @@ -46,25 +46,27 @@ protected Services getServices() { @BeforeEach public void setUp() throws IOException { - parseDecls(""" - \\sorts { boolean; elem; list; int; int_sort; numbers; } - \\functions { - elem head(list); - list tail(list); - list nil; - list cons(elem,list); - int aa ; - int bb ; - int cc ; - int dd ; - int ee ; - } - \\predicates { - isempty(list); - } - \\programVariables {int globalIntPV;}""" - - ); + if (lookup_sort("elem") == null) {// check whether declaration have already been parsed + parseDecls(""" + \\sorts { boolean; elem; list; int; int_sort; numbers; } + \\functions { + elem head(list); + list tail(list); + list nil; + list cons(elem,list); + int aa ; + int bb ; + int cc ; + int dd ; + int ee ; + } + \\predicates { + isempty(list); + } + \\programVariables {int globalIntPV;}""" + + ); + } elem = lookup_sort("elem"); list = lookup_sort("list"); From be9a1cc1bc363d246c0df0adab25727d9957e880 Mon Sep 17 00:00:00 2001 From: Mattias Ulbrich Date: Wed, 20 Dec 2023 12:25:40 +0100 Subject: [PATCH 38/66] adding example file for natural numbers as ADTs --- key.ui/examples/standard_key/adt/dt_nat.key | 21 ++ key.ui/examples/standard_key/adt/dt_nat.proof | 191 ++++++++++++++++++ 2 files changed, 212 insertions(+) create mode 100644 key.ui/examples/standard_key/adt/dt_nat.key create mode 100644 key.ui/examples/standard_key/adt/dt_nat.proof diff --git a/key.ui/examples/standard_key/adt/dt_nat.key b/key.ui/examples/standard_key/adt/dt_nat.key new file mode 100644 index 0000000000..07a8b6d884 --- /dev/null +++ b/key.ui/examples/standard_key/adt/dt_nat.key @@ -0,0 +1,21 @@ +\datatypes { + \free Nat = zero | succ(Nat pred); +} + +\predicates { + greaterThan(Nat, Nat); +} + +\functions{ + Nat plusNat(Nat, Nat); +} + +\programVariables { Nat x; Nat y; } + +\problem { + \forall Nat n; \forall Nat m; (plusNat(n, zero) = n & plusNat(n, succ(m)) = succ(plusNat(n, m))), + \forall Nat n; \forall Nat m; \forall Nat l; (greaterThan(n, m) & greaterThan(m, l) -> greaterThan(n, l)), + \forall Nat n; greaterThan(succ(n), n) +==> + greaterThan(plusNat(x,y), x) | y=zero } + diff --git a/key.ui/examples/standard_key/adt/dt_nat.proof b/key.ui/examples/standard_key/adt/dt_nat.proof new file mode 100644 index 0000000000..4020e11322 --- /dev/null +++ b/key.ui/examples/standard_key/adt/dt_nat.proof @@ -0,0 +1,191 @@ +\profile "Java Profile"; + +\settings // Proof-Settings-Config-File +{ + "Choice" : { + "JavaCard" : "JavaCard:off", + "Strings" : "Strings:on", + "assertions" : "assertions:safe", + "bigint" : "bigint:on", + "floatRules" : "floatRules:strictfpOnly", + "initialisation" : "initialisation:disableStaticInitialisation", + "intRules" : "intRules:arithmeticSemanticsIgnoringOF", + "integerSimplificationRules" : "integerSimplificationRules:full", + "javaLoopTreatment" : "javaLoopTreatment:efficient", + "mergeGenerateIsWeakeningGoal" : "mergeGenerateIsWeakeningGoal:off", + "methodExpansion" : "methodExpansion:modularOnly", + "modelFields" : "modelFields:treatAsAxiom", + "moreSeqRules" : "moreSeqRules:off", + "permissions" : "permissions:off", + "programRules" : "programRules:Java", + "reach" : "reach:on", + "runtimeExceptions" : "runtimeExceptions:ban", + "sequences" : "sequences:on", + "wdChecks" : "wdChecks:off", + "wdOperator" : "wdOperator:L" + }, + "Labels" : { + "UseOriginLabels" : true + }, + "NewSMT" : { + + }, + "SMTSettings" : { + "SelectedTaclets" : [ + + ], + "UseBuiltUniqueness" : false, + "explicitTypeHierarchy" : false, + "instantiateHierarchyAssumptions" : true, + "integersMaximum" : 2147483645, + "integersMinimum" : -2147483645, + "invariantForall" : false, + "maxGenericSorts" : 2, + "useConstantsForBigOrSmallIntegers" : true, + "useUninterpretedMultiplication" : true + }, + "Strategy" : { + "ActiveStrategy" : "JavaCardDLStrategy", + "MaximumNumberOfAutomaticApplications" : 10000, + "Timeout" : -1, + "options" : { + "AUTO_INDUCTION_OPTIONS_KEY" : "AUTO_INDUCTION_OFF", + "BLOCK_OPTIONS_KEY" : "BLOCK_CONTRACT_INTERNAL", + "CLASS_AXIOM_OPTIONS_KEY" : "CLASS_AXIOM_FREE", + "DEP_OPTIONS_KEY" : "DEP_ON", + "INF_FLOW_CHECK_PROPERTY" : "INF_FLOW_CHECK_FALSE", + "LOOP_OPTIONS_KEY" : "LOOP_SCOPE_INV_TACLET", + "METHOD_OPTIONS_KEY" : "METHOD_CONTRACT", + "MPS_OPTIONS_KEY" : "MPS_MERGE", + "NON_LIN_ARITH_OPTIONS_KEY" : "NON_LIN_ARITH_NONE", + "OSS_OPTIONS_KEY" : "OSS_ON", + "QUANTIFIERS_OPTIONS_KEY" : "QUANTIFIERS_NON_SPLITTING_WITH_PROGS", + "QUERYAXIOM_OPTIONS_KEY" : "QUERYAXIOM_ON", + "QUERY_NEW_OPTIONS_KEY" : "QUERY_OFF", + "SPLITTING_OPTIONS_KEY" : "SPLITTING_DELAYED", + "STOPMODE_OPTIONS_KEY" : "STOPMODE_DEFAULT", + "SYMBOLIC_EXECUTION_ALIAS_CHECK_OPTIONS_KEY" : "SYMBOLIC_EXECUTION_ALIAS_CHECK_NEVER", + "SYMBOLIC_EXECUTION_NON_EXECUTION_BRANCH_HIDING_OPTIONS_KEY" : "SYMBOLIC_EXECUTION_NON_EXECUTION_BRANCH_HIDING_OFF", + "USER_TACLETS_OPTIONS_KEY1" : "USER_TACLETS_OFF", + "USER_TACLETS_OPTIONS_KEY2" : "USER_TACLETS_OFF", + "USER_TACLETS_OPTIONS_KEY3" : "USER_TACLETS_OFF", + "VBT_PHASE" : "VBT_SYM_EX" + } + } + } + +\datatypes { + \free Nat = zero | succ(Nat pred); +} + +\predicates { + greaterThan(Nat, Nat); +} + +\functions{ + Nat plusNat(Nat, Nat); +} + +\rules { + plusDef { + \schemaVar \variable Nat n; + \schemaVar \variable Nat m; + \add( \forall n; \forall m; (plusNat(n, zero) = n & plusNat(n, succ(m)) = succ(plusNat(n, m))) ==> ) + }; + + greaterThanDef { + \schemaVar \variable Nat n; + \add( \forall n; greaterThan(succ(n), n) ==> ) + }; + + greaterThanTrans { + \schemaVar \variable Nat n; + \schemaVar \variable Nat m; + \schemaVar \variable Nat l; + \add( \forall Nat n; \forall Nat m; \forall Nat l; (greaterThan(n,m) & greaterThan(m,l) -> greaterThan(n,l)) ==> ) + }; +} + +\programVariables { Nat x; Nat y; } +\problem { +greaterThan(plusNat(x, y), x) | y = zero +} + +\proof { +(keyLog "0" (keyUser "mattias" ) (keyVersion "e0995588635b2e5e38c1791e254de76ab4391d36")) + +(autoModeTime "115") + +(branch "dummy ID" +(rule "orRight" (formula "4") (userinteraction)) +(rule "Nat_Ind" (inst "phi=(\\forall Nat x; + (( greaterThan(plusNat(x, y), x)<> + | (zero = y)<>)<>))<>") (inst "x=y") (userinteraction)) +(branch "zero" + (builtin "One Step Simplification" (formula "4") (userinteraction)) + (rule "closeTrue" (formula "4") (userinteraction)) +) +(branch "succ(Natpred)" + (rule "allRight" (formula "4") (inst "sk=pred_0") (userinteraction)) + (rule "impRight" (formula "4") (userinteraction)) + (rule "allRight" (formula "5") (inst "sk=x_0") (userinteraction)) + (rule "instAll" (formula "5") (term "0,0,0") (ifseqformula "1") (userinteraction)) + (rule "instAll" (formula "6") (term "0,0,0") (ifseqformula "3") (userinteraction)) + (rule "instAll" (formula "7") (term "0,1,0,0") (ifseqformula "1") (userinteraction)) + (rule "andLeft" (formula "1") (userinteraction)) + (rule "applyEqRigid" (formula "9") (term "0,0") (ifseqformula "2") (userinteraction)) + (rule "instAll" (formula "9") (term "0,0,0") (ifseqformula "8") (userinteraction)) + (rule "instAll" (formula "1") (term "0") (ifseqformula "8") (userinteraction)) + (rule "instAll" (formula "1") (term "0,0,0,0,0,0") (ifseqformula "1") (userinteraction)) + (rule "instAll" (formula "7") (term "1,0") (ifseqformula "1") (userinteraction)) + (rule "orRight" (formula "13")) + (rule "eqSymm" (formula "16")) + (rule "eqSymm" (formula "14")) + (rule "replace_known_left" (formula "1") (term "0,0,0") (ifseqformula "3")) + (builtin "One Step Simplification" (formula "1")) + (rule "replace_known_left" (formula "6") (term "0,0") (ifseqformula "4")) + (builtin "One Step Simplification" (formula "6")) + (rule "replace_known_left" (formula "7") (term "0,0") (ifseqformula "3")) + (builtin "One Step Simplification" (formula "7") (ifInst "" (formula "13"))) + (rule "notLeft" (formula "7")) + (rule "replace_known_right" (formula "7") (term "0") (ifseqformula "12")) + (builtin "One Step Simplification" (formula "7")) + (rule "replace_known_left" (formula "8") (term "1,0") (ifseqformula "7")) + (builtin "One Step Simplification" (formula "8")) + (rule "true_left" (formula "8")) + (rule "applyEq" (formula "4") (term "1,0") (ifseqformula "7")) + (rule "applyEq" (formula "15") (term "0") (ifseqformula "7")) + (rule "eqSymm" (formula "15")) + (rule "applyEq" (formula "13") (term "1") (ifseqformula "7")) + (rule "applyEqRigid" (formula "8") (term "1,0,0,0,0") (ifseqformula "7")) + (rule "applyEq" (formula "5") (term "0,1") (ifseqformula "4")) + (rule "applyEqRigid" (formula "11") (term "0") (ifseqformula "4")) + (rule "applyEq" (formula "12") (term "0,0") (ifseqformula "4")) + (rule "applyEqRigid" (formula "3") (term "0,0") (ifseqformula "4")) + (rule "applyEqRigid" (formula "2") (term "0,0,1,0,0") (ifseqformula "4")) + (rule "applyEq" (formula "1") (term "0,0,0") (ifseqformula "4")) + (rule "applyEq" (formula "3") (term "1") (ifseqformula "4")) + (rule "close" (formula "12") (ifseqformula "3")) +) +(branch "Use case of Nat" + (rule "eqSymm" (formula "6")) + (rule "eqSymm" (formula "1") (term "1,0,0")) + (rule "nnf_imp2or" (formula "3") (term "0,0,0")) + (rule "nnf_notAnd" (formula "3") (term "0,0,0,0")) + (rule "distr_forallAnd" (formula "2") (term "0")) + (builtin "One Step Simplification" (formula "2")) + (rule "distr_forallAnd" (formula "2")) + (rule "andLeft" (formula "2")) + (rule "commute_or" (formula "1") (term "0,0")) + (rule "commute_or" (formula "4") (term "0,0,0,0")) + (rule "commute_or_2" (formula "4") (term "0,0,0")) + (rule "allLeft" (formula "3") (inst "t=x")) + (rule "allLeft" (formula "1") (inst "t=y")) + (rule "eqSymm" (formula "1") (term "0,0")) + (rule "replace_known_right" (formula "1") (term "0,0") (ifseqformula "9")) + (builtin "One Step Simplification" (formula "1")) + (rule "allLeft" (formula "1") (inst "t=x")) + (rule "close" (formula "9") (ifseqformula "1")) +) +) +} From a8a10a878e316d8c599709b8be0673565eb5c752 Mon Sep 17 00:00:00 2001 From: Mattias Ulbrich Date: Wed, 20 Dec 2023 15:45:35 +0100 Subject: [PATCH 39/66] applying spotless --- .../java/de/uka/ilkd/key/settings/GeneralSettings.java | 10 +++++----- .../uka/ilkd/key/speclang/njml/JmlMarkerDecision.java | 4 +++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/key.core/src/main/java/de/uka/ilkd/key/settings/GeneralSettings.java b/key.core/src/main/java/de/uka/ilkd/key/settings/GeneralSettings.java index ab4cdd39d3..44d162edb0 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/settings/GeneralSettings.java +++ b/key.core/src/main/java/de/uka/ilkd/key/settings/GeneralSettings.java @@ -3,11 +3,11 @@ * SPDX-License-Identifier: GPL-2.0-only */ package de.uka.ilkd.key.settings; +import java.util.*; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.*; - public class GeneralSettings extends AbstractSettings { private static final Logger LOGGER = LoggerFactory.getLogger(GeneralSettings.class); @@ -206,11 +206,11 @@ public void readSettings(Properties props) { } { - var sysProp = System.getProperty(KEY_JML_ENABLED_KEYS); + String sysProp = System.getProperty(KEY_JML_ENABLED_KEYS); if (sysProp != null) { val = sysProp; LOGGER.warn("Use system property -P{}={}", KEY_JML_ENABLED_KEYS, sysProp); - }else { + } else { val = props.getProperty(prefix + KEY_JML_ENABLED_KEYS); } @@ -261,7 +261,7 @@ public void readSettings(Configuration props) { if (sysProp != null) { LOGGER.warn("Use system property -P{}={}", KEY_JML_ENABLED_KEYS, sysProp); setJmlEnabledKeys(new TreeSet<>(Arrays.stream(sysProp.split(",")).toList())); - }else { + } else { setJmlEnabledKeys(new TreeSet<>(props.getStringList(KEY_JML_ENABLED_KEYS))); } } diff --git a/key.core/src/main/java/de/uka/ilkd/key/speclang/njml/JmlMarkerDecision.java b/key.core/src/main/java/de/uka/ilkd/key/speclang/njml/JmlMarkerDecision.java index 126ec6ecf9..555a64bbde 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/speclang/njml/JmlMarkerDecision.java +++ b/key.core/src/main/java/de/uka/ilkd/key/speclang/njml/JmlMarkerDecision.java @@ -10,6 +10,7 @@ import java.util.stream.Collectors; import de.uka.ilkd.key.settings.ProofIndependentSettings; + import org.jspecify.annotations.NonNull; /** @@ -30,7 +31,8 @@ public class JmlMarkerDecision { */ public JmlMarkerDecision(JmlLexer lexer) { this.lexer = lexer; - setEnabledKeys(ProofIndependentSettings.DEFAULT_INSTANCE.getGeneralSettings().getJmlEnabledKeys()); + setEnabledKeys( + ProofIndependentSettings.DEFAULT_INSTANCE.getGeneralSettings().getJmlEnabledKeys()); } /** From 44087c2782b67b48ef74fa8f6d35a9cad4c3cfae Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Thu, 21 Dec 2023 10:51:52 +0100 Subject: [PATCH 40/66] Treat duplicate predicate declarations as error. --- .../uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java index edeadf11d6..c45e27f3de 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java @@ -78,6 +78,9 @@ public Object visitPred_decl(KeYParser.Pred_declContext ctx) { if (lookup(p.name()) == null) { functions().add(p); + } else { + // weigl: agreement on KaKeY meeting: this should be an error. + semanticError(ctx, "Predicate '" + p.name() + "' is already defined!"); } return null; } From 7212d7c774bd80450e71af1923309ac9282a086a Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Fri, 1 Dec 2023 10:34:45 +0100 Subject: [PATCH 41/66] Fix update of proof tree in case of filter changes (fixes #3367) --- .../de/uka/ilkd/key/gui/prooftree/ProofTreeView.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java index 8de525bfcc..6ce0e4b75d 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java @@ -654,13 +654,11 @@ void selectBranchNode(GUIBranchNode node) { proofListener.ignoreNodeSelectionChange = false; TreePath tp = new TreePath(node.getPath()); treeSelectionListener.ignoreChange = true; + delegateModel.storeSelection(delegateView.getSelectionPath()); delegateView.getSelectionModel().setSelectionPath(tp); delegateView.scrollPathToVisible(tp); delegateView.validate(); treeSelectionListener.ignoreChange = false; - - delegateModel.storeSelection(delegateView.getSelectionPath()); - } public void showSearchPanel() { @@ -689,7 +687,8 @@ public boolean setFilter(ProofTreeViewFilter filter, boolean selected) { return false; } - final TreePath selectedPath = delegateModel.getSelection(); + final TreePath selectedPath = delegateView.getSelectionPath(); + if (selectedPath == null) { return false; } @@ -697,7 +696,6 @@ public boolean setFilter(ProofTreeViewFilter filter, boolean selected) { // Save expansion state to restore. List rowsToExpand = new ArrayList<>(expansionState); - final TreePath branch; final Node invokedNode; if (selectedPath.getLastPathComponent() instanceof GUIProofTreeNode) { @@ -943,7 +941,6 @@ public void valueChanged(TreeSelectionEvent e) { TreePath newTP = e.getNewLeadSelectionPath(); delegateModel.storeSelection(newTP); - if (treeNode.getNode().proof().isDisposed()) { setProof(null); return; From 3bc05783b157d6cd57ec997810a990882caf1009 Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Fri, 1 Dec 2023 11:50:21 +0100 Subject: [PATCH 42/66] Store ProofTreeViewSettings per proof outside model and restore all settings upon switching --- .../key/gui/prooftree/GUIProofTreeModel.java | 13 -- .../ilkd/key/gui/prooftree/ProofTreeView.java | 117 ++++++++++++------ 2 files changed, 78 insertions(+), 52 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java index e2493edc28..9a59ac18b0 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java @@ -17,7 +17,6 @@ import org.key_project.util.collection.ImmutableList; -import org.jspecify.annotations.NonNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -513,18 +512,6 @@ public GUIBranchNode getBranchNode(Node n, Object label) { } } - - /** stores exactly the paths that are expanded in the proof tree */ - private @NonNull Collection expansionState = Collections.emptySet(); - - public void setExpansionState(@NonNull Collection c) { - expansionState = c; - } - - public @NonNull Collection getExpansionState() { - return expansionState; - } - TreePath selection; public void storeSelection(TreePath t) { diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java index 6ce0e4b75d..965c63a170 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java @@ -38,6 +38,7 @@ import de.uka.ilkd.key.proof.reference.ClosedBy; import de.uka.ilkd.key.rule.RuleApp; import de.uka.ilkd.key.settings.ProofIndependentSettings; +import de.uka.ilkd.key.util.Pair; import de.uka.ilkd.key.util.ThreadUtilities; import org.key_project.util.collection.ImmutableList; @@ -102,13 +103,9 @@ public class ProofTreeView extends JPanel implements TabPanel { private KeYMediator mediator; /** - * Stores for each loaded proof the GUI tree model. + * Stores for each loaded proof the view state */ - private final WeakHashMap models = new WeakHashMap<>(20); - /** - * Stores for each loaded proof the position of the scroll view. - */ - private final WeakHashMap scrollState = new WeakHashMap<>(); + private final WeakHashMap viewStates = new WeakHashMap<>(20); /** * The (currently selected) proof this view shows. @@ -463,37 +460,58 @@ public boolean selectBelow() { * @param p the Proof that has been loaded */ private void setProof(Proof p) { - if (proof != null) { - // save old scroll height - JScrollPane scroller = (JScrollPane) delegateView.getParent().getParent(); - scrollState.put(proof, scroller.getVerticalScrollBar().getValue()); - } if (proof == p) { return; // proof is already loaded } - ProofTreeViewFilter.NodeFilter filter = null; - if (delegateModel != null) { - filter = delegateModel.getActiveNodeFilter(); - expansionState.disconnect(); - delegateModel.setExpansionState(expansionState.copyState()); - delegateModel.storeSelection(delegateView.getSelectionPath()); - delegateModel.unregister(); - delegateModel.removeTreeModelListener(proofTreeSearchPanel); + + if (proof != null) { + // save old view state + JScrollPane scroller = (JScrollPane) delegateView.getParent().getParent(); + if (delegateModel != null) { // is it ever not null when proof != null? + var nodeFilter = delegateModel.getActiveNodeFilter(); + expansionState.disconnect(); + + final HashSet activeFilters = new HashSet<>(); + for (ProofTreeViewFilter f : ProofTreeViewFilter.ALL) { + if (f.isActive()) { + activeFilters.add(f); + } + } + + ProofTreeViewState memorizeProofTreeViewState = new ProofTreeViewState( + delegateModel, + expansionState.copyState(), + delegateView.getSelectionPath(), + activeFilters, + new Pair<>(nodeFilter, nodeFilter != null && nodeFilter.isActive()), + scroller.getVerticalScrollBar().getValue()); + + viewStates.put(proof, memorizeProofTreeViewState); + + delegateModel.unregister(); + delegateModel.removeTreeModelListener(proofTreeSearchPanel); + } + + } proof = p; if (proof != null) { - delegateModel = models.get(p); - if (delegateModel == null) { - delegateModel = new GUIProofTreeModel(p); - models.put(p, delegateModel); + ProofTreeViewState memorizedState = viewStates.get(proof); + + if (memorizedState == null) { + memorizedState = new ProofTreeViewState(new GUIProofTreeModel(p), + Collections.emptyList(), null, new HashSet<>(), + new Pair<>(null, false), 0); } + + delegateModel = memorizedState.model; delegateModel.addTreeModelListener(proofTreeSearchPanel); delegateModel.register(); delegateView.setModel(delegateModel); expansionState = - new ProofTreeExpansionState(delegateView, delegateModel.getExpansionState()); + new ProofTreeExpansionState(delegateView, memorizedState.expansionState); delegateView.expandRow(0); // Save expansion state to restore: @@ -505,18 +523,15 @@ private void setProof(Proof p) { } Collections.sort(rowsToExpand); - // Redraw the tree in case the ProofTreeViewFilters have changed - // since the last time the proof was loaded. - delegateModel.setFilter(filter, filter != null && filter.isActive()); // Expand previously visible rows. for (int i : rowsToExpand) { delegateView.expandRow(i); } - if (delegateModel.getSelection() != null) { - delegateView.setSelectionPath(delegateModel.getSelection()); - delegateView.scrollPathToVisible(delegateModel.getSelection()); + if (memorizedState.selectionPath != null) { + delegateView.setSelectionPath(memorizedState.selectionPath); + delegateView.scrollPathToVisible(memorizedState.selectionPath); } else { if (mediator.getSelectedProof() == p && mediator.getSelectedNode() != null) { makeNodeVisible(mediator.getSelectedNode()); @@ -528,10 +543,20 @@ private void setProof(Proof p) { // Restore previous scroll position. JScrollPane scroller = (JScrollPane) delegateView.getParent().getParent(); - Integer i = scrollState.get(proof); + Integer i = memorizedState.scrollState; if (i != null) { scroller.getVerticalScrollBar().setValue(i); } + + // restore filters + for (var viewFilter : ProofTreeViewFilter.ALL) { + setFilter(viewFilter, + memorizedState.activeFilters.contains(viewFilter)); + } + + delegateModel.setFilter(memorizedState.nodeFilterState.first, + memorizedState.nodeFilterState.second); + } else { delegateModel = null; delegateView @@ -539,18 +564,11 @@ private void setProof(Proof p) { expansionState = null; } proofTreeSearchPanel.reset(); - - for (ProofTreeViewFilter f : ProofTreeViewFilter.ALL) { - if (f.isActive()) { - setFilter(f, true); - } - } } public void removeProofs(Proof[] ps) { for (final Proof p : ps) { - models.remove(p); - scrollState.remove(p); + viewStates.remove(p); mediator.getCurrentlyOpenedProofs().remove(p); } } @@ -1283,4 +1301,25 @@ public Node getSelectedNode() { ? ((GUIAbstractTreeNode) treeNode).getNode() : null; } + + + /** + * Record used to store the state of the proof tree view for a particular proof such that it can + * be stored and + * restored when switching proofs + * + * @param model the {@link GUIProofTreeModel} of the proof + * @param expansionState the expanded tree paths + * @param selectionPath the path to the currently selected node + * @param activeFilters the activated {@link ProofTreeViewFilter}s + * @param nodeFilterState the activated (if any) {@link ProofTreeViewFilter.NodeFilter} + * @param scrollState the state of the scroll pane + */ + record ProofTreeViewState(GUIProofTreeModel model, + Collection expansionState, + TreePath selectionPath, + HashSet activeFilters, + Pair nodeFilterState, + Integer scrollState) { + } } From 95f863e201263126b261c6cdfc70678b3770c0e9 Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Fri, 1 Dec 2023 12:10:40 +0100 Subject: [PATCH 43/66] Restore correct node selection and remove unused fields from GUIProofTreeModel --- .../key/gui/prooftree/GUIProofTreeModel.java | 10 ----- .../ilkd/key/gui/prooftree/ProofTreeView.java | 38 +++++++++---------- 2 files changed, 17 insertions(+), 31 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java index 9a59ac18b0..505462d341 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java @@ -512,16 +512,6 @@ public GUIBranchNode getBranchNode(Node n, Object label) { } } - TreePath selection; - - public void storeSelection(TreePath t) { - selection = t; - } - - public TreePath getSelection() { - return selection; - } - public NodeFilter getActiveNodeFilter() { return activeNodeFilter; } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java index 965c63a170..19a5037c64 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java @@ -491,8 +491,6 @@ private void setProof(Proof p) { delegateModel.unregister(); delegateModel.removeTreeModelListener(proofTreeSearchPanel); } - - } proof = p; @@ -524,6 +522,23 @@ private void setProof(Proof p) { Collections.sort(rowsToExpand); + + // Restore previous scroll position. + JScrollPane scroller = (JScrollPane) delegateView.getParent().getParent(); + Integer scrollState = memorizedState.scrollState; + if (scrollState != null) { + scroller.getVerticalScrollBar().setValue(scrollState); + } + + // restore filters + for (var viewFilter : ProofTreeViewFilter.ALL) { + setFilter(viewFilter, + memorizedState.activeFilters.contains(viewFilter)); + } + + delegateModel.setFilter(memorizedState.nodeFilterState.first, + memorizedState.nodeFilterState.second); + // Expand previously visible rows. for (int i : rowsToExpand) { delegateView.expandRow(i); @@ -540,23 +555,6 @@ private void setProof(Proof p) { delegateView.setSelectionRow(1); } } - - // Restore previous scroll position. - JScrollPane scroller = (JScrollPane) delegateView.getParent().getParent(); - Integer i = memorizedState.scrollState; - if (i != null) { - scroller.getVerticalScrollBar().setValue(i); - } - - // restore filters - for (var viewFilter : ProofTreeViewFilter.ALL) { - setFilter(viewFilter, - memorizedState.activeFilters.contains(viewFilter)); - } - - delegateModel.setFilter(memorizedState.nodeFilterState.first, - memorizedState.nodeFilterState.second); - } else { delegateModel = null; delegateView @@ -672,7 +670,6 @@ void selectBranchNode(GUIBranchNode node) { proofListener.ignoreNodeSelectionChange = false; TreePath tp = new TreePath(node.getPath()); treeSelectionListener.ignoreChange = true; - delegateModel.storeSelection(delegateView.getSelectionPath()); delegateView.getSelectionModel().setSelectionPath(tp); delegateView.scrollPathToVisible(tp); delegateView.validate(); @@ -957,7 +954,6 @@ public void valueChanged(TreeSelectionEvent e) { } TreePath newTP = e.getNewLeadSelectionPath(); - delegateModel.storeSelection(newTP); if (treeNode.getNode().proof().isDisposed()) { setProof(null); From c5cb544fbeded1d3ab8ae01c788edb03e4420ab0 Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Fri, 1 Dec 2023 13:56:12 +0100 Subject: [PATCH 44/66] Fix node filter selection display in popup dialoh and some refactoring --- .../key/gui/prooftree/GUIProofTreeModel.java | 8 +- .../ilkd/key/gui/prooftree/ProofTreeView.java | 81 ++++++++----------- 2 files changed, 40 insertions(+), 49 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java index 505462d341..6508c75a0f 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIProofTreeModel.java @@ -263,13 +263,17 @@ public boolean globalFilterActive() { */ public synchronized void setFilter(ProofTreeViewFilter filter, boolean active) { if (filter == null) { - activeNodeFilter = null; + if (activeNodeFilter != null) { + activeNodeFilter.setActive(false); + activeNodeFilter = null; + } updateTree((TreeNode) null); return; } if (!filter.global()) { - if (activeNodeFilter != null) + if (activeNodeFilter != null) { activeNodeFilter.setActive(false); + } activeNodeFilter = active ? (NodeFilter) filter : null; } filter.setActive(active); diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java index 19a5037c64..f9d601ef62 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java @@ -474,6 +474,8 @@ private void setProof(Proof p) { final HashSet activeFilters = new HashSet<>(); for (ProofTreeViewFilter f : ProofTreeViewFilter.ALL) { if (f.isActive()) { + // ignore node filters as only one might be active at a given time + // their state is saved independently activeFilters.add(f); } } @@ -488,6 +490,9 @@ private void setProof(Proof p) { viewStates.put(proof, memorizeProofTreeViewState); + if (nodeFilter != null) { + delegateModel.setFilter(nodeFilter, false); + } delegateModel.unregister(); delegateModel.removeTreeModelListener(proofTreeSearchPanel); } @@ -713,66 +718,34 @@ public boolean setFilter(ProofTreeViewFilter filter, boolean selected) { final TreePath branch; final Node invokedNode; - if (selectedPath.getLastPathComponent() instanceof GUIProofTreeNode) { + if (selectedPath.getLastPathComponent() instanceof GUIProofTreeNode guiNode) { branch = selectedPath.getParentPath(); - invokedNode = - ((GUIProofTreeNode) selectedPath.getLastPathComponent()).getNode(); + invokedNode = guiNode.getNode(); } else { branch = selectedPath; invokedNode = ((GUIBranchNode) selectedPath.getLastPathComponent()).getNode(); } + delegateModel.setFilter(filter, selected); + if (!filter.global()) { - delegateModel.setFilter(filter, selected); if (branch == selectedPath) { - if (delegateModel.getRoot() instanceof GUIBranchNode) { - TreeNode node = ((GUIAbstractTreeNode) delegateModel.getRoot()) - .findBranch(invokedNode); - if (node instanceof GUIBranchNode) { - selectBranchNode((GUIBranchNode) node); - } - } + selectedNodeIsBranchNode(invokedNode); } else { delegateView.scrollPathToVisible(selectedPath); delegateView.setSelectionPath(selectedPath); } + } else if (branch == selectedPath && + (!selected || invokedNode.parent() == null || + delegateModel + .getProofTreeNode(invokedNode.parent()) + .findChild(invokedNode.parent()) == null)) { + selectedNodeIsBranchNode(invokedNode); } else { - delegateModel.setFilter(filter, selected); - if (branch == selectedPath) { - if (!selected) { - if (delegateModel.getRoot() instanceof GUIBranchNode) { - TreeNode node = ((GUIAbstractTreeNode) delegateModel.getRoot()) - .findBranch(invokedNode); - if (node instanceof GUIBranchNode) { - selectBranchNode((GUIBranchNode) node); - } - } - } else { - if (invokedNode.parent() == null || delegateModel - .getProofTreeNode(invokedNode.parent()) - .findChild(invokedNode.parent()) == null) { - // it's still a branch - if (delegateModel.getRoot() instanceof GUIBranchNode) { - TreeNode node = - ((GUIAbstractTreeNode) delegateModel.getRoot()) - .findBranch(invokedNode); - if (node instanceof GUIBranchNode) { - selectBranchNode((GUIBranchNode) node); - } - } - } else { - TreePath tp = new TreePath(delegateModel - .getProofTreeNode(invokedNode).getPath()); - delegateView.scrollPathToVisible(tp); - delegateView.setSelectionPath(tp); - } - } - } else { - TreePath tp = new TreePath( - delegateModel.getProofTreeNode(invokedNode).getPath()); - delegateView.scrollPathToVisible(tp); - delegateView.setSelectionPath(tp); - } + final TreePath tp = new TreePath(delegateModel + .getProofTreeNode(invokedNode).getPath()); + delegateView.scrollPathToVisible(tp); + delegateView.setSelectionPath(tp); } // Expand previously visible rows. @@ -788,6 +761,20 @@ public boolean setFilter(ProofTreeViewFilter filter, boolean selected) { return true; } + /** + * if invoked node is modelled as branch node, select the branch node + * + * @param invokedNode the selected node in the proof + */ + private void selectedNodeIsBranchNode(Node invokedNode) { + if (delegateModel.getRoot() instanceof GUIBranchNode rootNode) { + final TreeNode node = rootNode.findBranch(invokedNode); + if (node instanceof GUIBranchNode childAsBranchNode) { + selectBranchNode(childAsBranchNode); + } + } + } + @NonNull @Override public Collection getTitleCActions() { From b846313047bb92213d25279554ad5ea7e7565e75 Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Fri, 1 Dec 2023 14:39:50 +0100 Subject: [PATCH 45/66] Fix problem with closed subtree filter --- .../ilkd/key/gui/prooftree/GUIBranchNode.java | 59 ++++--------------- .../ilkd/key/gui/prooftree/ProofTreeView.java | 9 +++ .../uka/ilkd/key/proof/io/ProblemLoader.java | 4 +- 3 files changed, 25 insertions(+), 47 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIBranchNode.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIBranchNode.java index bff237c986..e66df61c63 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIBranchNode.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIBranchNode.java @@ -6,6 +6,7 @@ * this class implements a TreeModel that can be displayed using the JTree class framework */ +import java.util.ArrayList; import javax.swing.tree.TreeNode; import de.uka.ilkd.key.proof.Node; @@ -16,22 +17,17 @@ class GUIBranchNode extends GUIAbstractTreeNode implements TreeNode { private final Object label; + private ArrayList childrenCache = null; + + public GUIBranchNode(GUIProofTreeModel tree, Node subTree, Object label) { super(tree, subTree); this.label = label; } - - private TreeNode[] childrenCache = null; - - private void createChildrenCache() { - childrenCache = new TreeNode[getChildCountHelp()]; - } - public TreeNode getChildAt(int childIndex) { - fillChildrenCache(); - return childrenCache[childIndex]; - + ensureChildrenCacheExists(); + return childrenCache.get(childIndex); /* * int count = 0; Node n = subTree; while ( childIndex != count && n.childrenCount() == 1 ) * { count++; n = n.child(0); } if ( childIndex == count ) { return getProofTreeModel @@ -39,12 +35,10 @@ public TreeNode getChildAt(int childIndex) { */ } - private void fillChildrenCache() { + private void ensureChildrenCacheExists() { if (childrenCache == null) { - createChildrenCache(); - } - - if (childrenCache.length == 0 || childrenCache[0] != null) { + childrenCache = new ArrayList<>(); + } else { return; } @@ -56,7 +50,7 @@ private void fillChildrenCache() { } while (true) { - childrenCache[count] = getProofTreeModel().getProofTreeNode(n); + childrenCache.add(count, getProofTreeModel().getProofTreeNode(n)); count++; final Node nextN = findChild(n); if (nextN == null) { @@ -67,7 +61,7 @@ private void fillChildrenCache() { for (int i = 0; i != n.childrenCount(); ++i) { if (!ProofTreeViewFilter.hiddenByGlobalFilters(n.child(i))) { - childrenCache[count] = findBranch(n.child(i)); + childrenCache.add(count, findBranch(n.child(i))); count++; } } @@ -86,38 +80,11 @@ public String getSearchString() { public int getChildCount() { if (childrenCache == null) { - createChildrenCache(); - } - return childrenCache.length; - } - - private int getChildCountHelp() { - int count = 0; - Node n = getNode(); - - if (n == null) { - return 0; + ensureChildrenCacheExists(); } - - while (true) { - count++; - final Node nextN = findChild(n); - if (nextN == null) { - break; - } - n = nextN; - } - - for (int i = 0; i != n.childrenCount(); ++i) { - if (!ProofTreeViewFilter.hiddenByGlobalFilters(n.child(i))) { - count++; - } - } - - return count; + return childrenCache.size(); } - public TreeNode getParent() { Node self = getNode(); if (self == null) { diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java index f9d601ef62..e5c10687f2 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java @@ -535,6 +535,15 @@ private void setProof(Proof p) { scroller.getVerticalScrollBar().setValue(scrollState); } + + // this selection must happen before and later after restoring the filters + // as setting a filter immediately applies it and + if (memorizedState.selectionPath != null) { + delegateView.setSelectionPath(memorizedState.selectionPath); + } else { + delegateView.setSelectionRow(0); + } + // restore filters for (var viewFilter : ProofTreeViewFilter.ALL) { setFilter(viewFilter, diff --git a/key.ui/src/main/java/de/uka/ilkd/key/proof/io/ProblemLoader.java b/key.ui/src/main/java/de/uka/ilkd/key/proof/io/ProblemLoader.java index f66f262519..1f4e9b9133 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/proof/io/ProblemLoader.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/proof/io/ProblemLoader.java @@ -143,7 +143,9 @@ protected void done() { mediator.getUI().reportStatus(this, errorMessage); } fireTaskFinished(runTime, message); - mediator.getSelectionModel().defaultSelection(); + if (mediator.getSelectedProof() != null) { + mediator.getSelectionModel().defaultSelection(); + } } } }; From 257e372fd8e7ebf153c92f90c448c60d298e1294 Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Fri, 1 Dec 2023 16:54:34 +0100 Subject: [PATCH 46/66] Minor clean up to slightly simplify complexity of path selection in ProofTreeView --- .../gui/prooftree/ProofTreePopupFactory.java | 12 +++- .../key/gui/prooftree/ProofTreeSearchBar.java | 9 +-- .../ilkd/key/gui/prooftree/ProofTreeView.java | 57 ++++++++----------- 3 files changed, 39 insertions(+), 39 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreePopupFactory.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreePopupFactory.java index bdca3bbd4e..3866cf218a 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreePopupFactory.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreePopupFactory.java @@ -309,7 +309,11 @@ public void actionPerformed(ActionEvent e) { } } if (sibling instanceof GUIBranchNode) { - context.proofTreeView.selectBranchNode((GUIBranchNode) sibling); + var tp = context.proofTreeView.selectBranchNode((GUIBranchNode) sibling); + if (tp != null) { + context.delegateView.setSelectionPath(tp); + context.delegateView.scrollPathToVisible(tp); + } } } } @@ -342,7 +346,11 @@ public void actionPerformed(ActionEvent e) { } } if (sibling instanceof GUIBranchNode) { - context.proofTreeView.selectBranchNode((GUIBranchNode) sibling); + var tp = context.proofTreeView.selectBranchNode((GUIBranchNode) sibling); + if (tp != null) { + context.delegateView.setSelectionPath(tp); + context.delegateView.scrollPathToVisible(tp); + } } } } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeSearchBar.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeSearchBar.java index 17035b07d7..f90def1f60 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeSearchBar.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeSearchBar.java @@ -71,11 +71,12 @@ private synchronized boolean search(String searchString, Position.Bias direction tp = new TreePath(node.getPath()); } if (node instanceof GUIBranchNode) { - this.proofTreeView.selectBranchNode((GUIBranchNode) node); - } else { - this.proofTreeView.delegateView.scrollPathToVisible(tp); - this.proofTreeView.delegateView.setSelectionPath(tp); + tp = this.proofTreeView.selectBranchNode((GUIBranchNode) node); } + + this.proofTreeView.delegateView.scrollPathToVisible(tp); + this.proofTreeView.delegateView.setSelectionPath(tp); + return currentRow != -1; } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java index e5c10687f2..38eea03f35 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java @@ -526,8 +526,6 @@ private void setProof(Proof p) { } Collections.sort(rowsToExpand); - - // Restore previous scroll position. JScrollPane scroller = (JScrollPane) delegateView.getParent().getParent(); Integer scrollState = memorizedState.scrollState; @@ -535,7 +533,6 @@ private void setProof(Proof p) { scroller.getVerticalScrollBar().setValue(scrollState); } - // this selection must happen before and later after restoring the filters // as setting a filter immediately applies it and if (memorizedState.selectionPath != null) { @@ -597,7 +594,6 @@ public void makeNodeVisible(Node n) { if (node == null) { return; } - TreeNode[] obs = node.getPath(); TreePath tp = new TreePath(obs); treeSelectionListener.ignoreChange = true; @@ -675,19 +671,14 @@ private void collapseOthersHelp(TreePath start, TreePath stop) { * Selects the given Branchnode in the ProofTreeView and displays the first child in the main * view. */ - void selectBranchNode(GUIBranchNode node) { + TreePath selectBranchNode(GUIBranchNode node) { if (node == null) { - return; + return null; } proofListener.ignoreNodeSelectionChange = true; mediator.getSelectionModel().setSelectedNode(node.getNode()); proofListener.ignoreNodeSelectionChange = false; - TreePath tp = new TreePath(node.getPath()); - treeSelectionListener.ignoreChange = true; - delegateView.getSelectionModel().setSelectionPath(tp); - delegateView.scrollPathToVisible(tp); - delegateView.validate(); - treeSelectionListener.ignoreChange = false; + return new TreePath(node.getPath()); } public void showSearchPanel() { @@ -716,7 +707,7 @@ public boolean setFilter(ProofTreeViewFilter filter, boolean selected) { return false; } - final TreePath selectedPath = delegateView.getSelectionPath(); + TreePath selectedPath = delegateView.getSelectionPath(); if (selectedPath == null) { return false; @@ -737,26 +728,21 @@ public boolean setFilter(ProofTreeViewFilter filter, boolean selected) { delegateModel.setFilter(filter, selected); - if (!filter.global()) { - if (branch == selectedPath) { - selectedNodeIsBranchNode(invokedNode); - } else { - delegateView.scrollPathToVisible(selectedPath); - delegateView.setSelectionPath(selectedPath); - } + if (!filter.global() && branch == selectedPath) { + selectedPath = getPathForBranchNode(invokedNode, selectedPath); } else if (branch == selectedPath && (!selected || invokedNode.parent() == null || delegateModel .getProofTreeNode(invokedNode.parent()) .findChild(invokedNode.parent()) == null)) { - selectedNodeIsBranchNode(invokedNode); + selectedPath = getPathForBranchNode(invokedNode, selectedPath); } else { - final TreePath tp = new TreePath(delegateModel - .getProofTreeNode(invokedNode).getPath()); - delegateView.scrollPathToVisible(tp); - delegateView.setSelectionPath(tp); + selectedPath = new TreePath(delegateModel.getProofTreeNode(invokedNode).getPath()); } + delegateView.setSelectionPath(selectedPath); + delegateView.scrollPathToVisible(selectedPath); + // Expand previously visible rows. for (TreePath tp : rowsToExpand) { TreePath newTp = delegateView.getPathForRow(0); @@ -774,14 +760,17 @@ public boolean setFilter(ProofTreeViewFilter filter, boolean selected) { * if invoked node is modelled as branch node, select the branch node * * @param invokedNode the selected node in the proof + * @param defaultPath the {@link TreePath} to be returned if the invokedNode does not have an associated branch node + * @return the path to the branch node if available otherwise {@code defaultPath} */ - private void selectedNodeIsBranchNode(Node invokedNode) { + private TreePath getPathForBranchNode(Node invokedNode, TreePath defaultPath) { if (delegateModel.getRoot() instanceof GUIBranchNode rootNode) { final TreeNode node = rootNode.findBranch(invokedNode); if (node instanceof GUIBranchNode childAsBranchNode) { - selectBranchNode(childAsBranchNode); + return selectBranchNode(childAsBranchNode); } } + return defaultPath; } @NonNull @@ -955,8 +944,9 @@ public void valueChanged(TreeSelectionEvent e) { setProof(null); return; } + if (treeNode instanceof GUIBranchNode) { - selectBranchNode((GUIBranchNode) treeNode); + newTP = selectBranchNode((GUIBranchNode) treeNode); } else { Node node = treeNode.getNode(); Goal selected = proof.getOpenGoal(node); @@ -972,15 +962,16 @@ public void valueChanged(TreeSelectionEvent e) { .replaceFormula(ossNode.getFormulaNr(), pio.sequentFormula()).sequent(); mediator.getSelectionModel().setSelectedSequentAndRuleApp( ossParentNode.getNode(), modifiedSequent, ossNode.getRuleApp()); - - // ensure the proper node is selected in the tree - ignoreChange = true; - delegateView.setSelectionPath(newTP); - ignoreChange = false; } else { mediator.nonGoalNodeChosen(node); } } + // ensure the proper node is selected in the tree + if (newTP != null && !newTP.equals(e.getNewLeadSelectionPath())) { + ignoreChange = true; + delegateView.setSelectionPath(newTP); + ignoreChange = false; + } } } From b96f1342fb86960185c08ca8aed020d690cca4c4 Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Fri, 1 Dec 2023 19:58:43 +0100 Subject: [PATCH 47/66] MainWindow updates sequent view after settings change for pretty printing --- key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java | 2 +- .../de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java | 2 +- .../main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java index 7b9d1be3a0..9a72548c94 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java @@ -838,6 +838,7 @@ public void makePrettyView() { getMediator().getNotationInfo().refresh(mediator.getServices()); getMediator().getSelectedProof().fireProofGoalsChanged(); } + SwingUtilities.invokeLater(this::updateSequentView); } private void addToProofList(de.uka.ilkd.key.proof.ProofAggregate plist) { @@ -1808,5 +1809,4 @@ public void selectedNodeChanged(KeYSelectionEvent e) { public void setSequentView(SequentView sequentView) { sequentViewSearchBar.setSequentView(sequentView); } - } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java index 25a584fbaf..7273876aea 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java @@ -7,7 +7,7 @@ import java.awt.event.ActionEvent; import java.beans.PropertyChangeListener; import java.util.EventObject; -import javax.swing.JCheckBoxMenuItem; +import javax.swing.*; import de.uka.ilkd.key.gui.MainWindow; import de.uka.ilkd.key.pp.NotationInfo; diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java index 38eea03f35..dffff7b00a 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java @@ -760,7 +760,8 @@ public boolean setFilter(ProofTreeViewFilter filter, boolean selected) { * if invoked node is modelled as branch node, select the branch node * * @param invokedNode the selected node in the proof - * @param defaultPath the {@link TreePath} to be returned if the invokedNode does not have an associated branch node + * @param defaultPath the {@link TreePath} to be returned if the invokedNode does not have an + * associated branch node * @return the path to the branch node if available otherwise {@code defaultPath} */ private TreePath getPathForBranchNode(Node invokedNode, TreePath defaultPath) { From 78d0d3804492761ac2aedde533cd57688fb016fc Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Sat, 2 Dec 2023 08:33:24 +0100 Subject: [PATCH 48/66] USe refactorings from #3369 but preserve non-local filter semantics for proof tree view --- .../ilkd/key/gui/prooftree/ProofTreeView.java | 81 ++++++------------- 1 file changed, 26 insertions(+), 55 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java index dffff7b00a..60ea08d8ab 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java @@ -38,7 +38,6 @@ import de.uka.ilkd.key.proof.reference.ClosedBy; import de.uka.ilkd.key.rule.RuleApp; import de.uka.ilkd.key.settings.ProofIndependentSettings; -import de.uka.ilkd.key.util.Pair; import de.uka.ilkd.key.util.ThreadUtilities; import org.key_project.util.collection.ImmutableList; @@ -404,8 +403,8 @@ public boolean selectAbove() { int row = delegateView.getRowForPath(path); row--; while (delegateView.getPathForRow(row) != null) { - TreePath tp = delegateView.getPathForRow(row); - var treeNode = (GUIAbstractTreeNode) tp.getLastPathComponent(); + final TreePath tp = delegateView.getPathForRow(row); + final var treeNode = (GUIAbstractTreeNode) tp.getLastPathComponent(); if (treeNode instanceof GUIBranchNode && treeNode.getNode().parent() != null && treeNode.getNode().parent().childrenCount() > 1 && !delegateView.isExpanded(tp)) { @@ -464,35 +463,22 @@ private void setProof(Proof p) { return; // proof is already loaded } + ProofTreeViewFilter.NodeFilter previousNodeFilter = null; + boolean previousNodeFilterState = false; if (proof != null) { // save old view state - JScrollPane scroller = (JScrollPane) delegateView.getParent().getParent(); if (delegateModel != null) { // is it ever not null when proof != null? - var nodeFilter = delegateModel.getActiveNodeFilter(); + JScrollPane scroller = (JScrollPane) delegateView.getParent().getParent(); expansionState.disconnect(); - - final HashSet activeFilters = new HashSet<>(); - for (ProofTreeViewFilter f : ProofTreeViewFilter.ALL) { - if (f.isActive()) { - // ignore node filters as only one might be active at a given time - // their state is saved independently - activeFilters.add(f); - } - } - + previousNodeFilter = delegateModel.getActiveNodeFilter(); + previousNodeFilterState = + previousNodeFilter != null && previousNodeFilter.isActive(); ProofTreeViewState memorizeProofTreeViewState = new ProofTreeViewState( delegateModel, expansionState.copyState(), delegateView.getSelectionPath(), - activeFilters, - new Pair<>(nodeFilter, nodeFilter != null && nodeFilter.isActive()), scroller.getVerticalScrollBar().getValue()); - viewStates.put(proof, memorizeProofTreeViewState); - - if (nodeFilter != null) { - delegateModel.setFilter(nodeFilter, false); - } delegateModel.unregister(); delegateModel.removeTreeModelListener(proofTreeSearchPanel); } @@ -504,9 +490,8 @@ private void setProof(Proof p) { ProofTreeViewState memorizedState = viewStates.get(proof); if (memorizedState == null) { - memorizedState = new ProofTreeViewState(new GUIProofTreeModel(p), - Collections.emptyList(), null, new HashSet<>(), - new Pair<>(null, false), 0); + memorizedState = new ProofTreeViewState(new GUIProofTreeModel(proof), + Collections.emptyList(), null, 0); } delegateModel = memorizedState.model; @@ -526,35 +511,15 @@ private void setProof(Proof p) { } Collections.sort(rowsToExpand); - // Restore previous scroll position. - JScrollPane scroller = (JScrollPane) delegateView.getParent().getParent(); - Integer scrollState = memorizedState.scrollState; - if (scrollState != null) { - scroller.getVerticalScrollBar().setValue(scrollState); - } - - // this selection must happen before and later after restoring the filters - // as setting a filter immediately applies it and - if (memorizedState.selectionPath != null) { - delegateView.setSelectionPath(memorizedState.selectionPath); - } else { - delegateView.setSelectionRow(0); - } - // restore filters for (var viewFilter : ProofTreeViewFilter.ALL) { - setFilter(viewFilter, - memorizedState.activeFilters.contains(viewFilter)); + setFilter(viewFilter, viewFilter.isActive()); } - delegateModel.setFilter(memorizedState.nodeFilterState.first, - memorizedState.nodeFilterState.second); - - // Expand previously visible rows. - for (int i : rowsToExpand) { - delegateView.expandRow(i); - } + // restore node filter + delegateModel.setFilter(previousNodeFilter, previousNodeFilterState); + // restore selection if (memorizedState.selectionPath != null) { delegateView.setSelectionPath(memorizedState.selectionPath); delegateView.scrollPathToVisible(memorizedState.selectionPath); @@ -566,6 +531,18 @@ private void setProof(Proof p) { delegateView.setSelectionRow(1); } } + + // Expand previously visible rows. + for (int i : rowsToExpand) { + delegateView.expandRow(i); + } + + // Restore previous scroll position. + JScrollPane scroller = (JScrollPane) delegateView.getParent().getParent(); + Integer scrollState = memorizedState.scrollState; + if (scrollState != null) { + scroller.getVerticalScrollBar().setValue(scrollState); + } } else { delegateModel = null; delegateView @@ -589,7 +566,6 @@ public void makeNodeVisible(Node n) { if (n == null) { return; } - final GUIAbstractTreeNode node = delegateModel.getProofTreeNode(n); if (node == null) { return; @@ -1286,7 +1262,6 @@ public Node getSelectedNode() { : null; } - /** * Record used to store the state of the proof tree view for a particular proof such that it can * be stored and @@ -1295,15 +1270,11 @@ public Node getSelectedNode() { * @param model the {@link GUIProofTreeModel} of the proof * @param expansionState the expanded tree paths * @param selectionPath the path to the currently selected node - * @param activeFilters the activated {@link ProofTreeViewFilter}s - * @param nodeFilterState the activated (if any) {@link ProofTreeViewFilter.NodeFilter} * @param scrollState the state of the scroll pane */ record ProofTreeViewState(GUIProofTreeModel model, Collection expansionState, TreePath selectionPath, - HashSet activeFilters, - Pair nodeFilterState, Integer scrollState) { } } From 61b855bc14ca8d29d7477547bd2f7b1915a9d9e7 Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Sat, 2 Dec 2023 10:45:37 +0100 Subject: [PATCH 49/66] Remove duplicate update of sequentview --- key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java index 9a72548c94..cd00d4bbe5 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/MainWindow.java @@ -836,7 +836,6 @@ public void unfreezeExceptAutoModeButton() { public void makePrettyView() { if (getMediator().ensureProofLoaded()) { getMediator().getNotationInfo().refresh(mediator.getServices()); - getMediator().getSelectedProof().fireProofGoalsChanged(); } SwingUtilities.invokeLater(this::updateSequentView); } @@ -1743,7 +1742,6 @@ public synchronized void selectedProofChanged(KeYSelectionEvent e) { } disableCurrentGoalView = false; - SwingUtilities.invokeLater(MainWindow.this::updateSequentView); makePrettyView(); } From e27143f4bcfe6689713974b017dbb6e600147507 Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Sat, 2 Dec 2023 11:17:24 +0100 Subject: [PATCH 50/66] Reduce number of sequentview updates Each view setting update caused it own redraw even if itself did not change. --- .../actions/HidePackagePrefixToggleAction.java | 15 ++++++--------- .../key/gui/actions/PrettyPrintToggleAction.java | 14 ++++++++------ .../ilkd/key/gui/actions/UnicodeToggleAction.java | 10 ++++++---- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java index d0a6c1dba2..242fe272ba 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java @@ -4,8 +4,8 @@ package de.uka.ilkd.key.gui.actions; import java.awt.event.ActionEvent; +import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.util.EventObject; import javax.swing.*; import de.uka.ilkd.key.gui.MainWindow; @@ -55,16 +55,13 @@ public void actionPerformed(ActionEvent e) { // the UI will react on the settings // change event! ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().setHidePackagePrefix(selected); - updateMainWindow(); } - private void updateMainWindow() { - mainWindow.makePrettyView(); - } - - private void handleViewSettingsChanged(EventObject e) { - updateSelectedState(); - updateMainWindow(); + private void handleViewSettingsChanged(PropertyChangeEvent e) { + if (NAME.equals(e.getPropertyName())) { + updateSelectedState(); + mainWindow.makePrettyView(); + } } } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java index 7273876aea..8f2dea8c77 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java @@ -5,8 +5,8 @@ import java.awt.event.ActionEvent; +import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.util.EventObject; import javax.swing.*; import de.uka.ilkd.key.gui.MainWindow; @@ -67,10 +67,12 @@ protected void updateMainWindow(boolean prettySyntax) { mainWindow.makePrettyView(); } - protected void handleViewSettingsChanged(EventObject e) { - updateSelectedState(); - final boolean prettySyntax = - ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().isUsePretty(); - updateMainWindow(prettySyntax); + protected void handleViewSettingsChanged(PropertyChangeEvent e) { + if (NAME.equals(e.getPropertyName())) { + updateSelectedState(); + final boolean prettySyntax = + ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().isUsePretty(); + updateMainWindow(prettySyntax); + } } } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java index 213a751ec8..41a5632e8e 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java @@ -4,8 +4,8 @@ package de.uka.ilkd.key.gui.actions; import java.awt.event.ActionEvent; +import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.util.EventObject; import javax.swing.JCheckBoxMenuItem; import de.uka.ilkd.key.gui.MainWindow; @@ -71,8 +71,10 @@ protected void updateMainWindow() { mainWindow.makePrettyView(); } - protected void handleViewSettingsChanged(EventObject e) { - updateSelectedState(); - updateMainWindow(); + protected void handleViewSettingsChanged(PropertyChangeEvent e) { + if (NAME.equals(e.getPropertyName())) { + updateSelectedState(); + updateMainWindow(); + } } } From 756b5c08e808daf599cadd12efe47dc33cc5160f Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Sat, 2 Dec 2023 13:13:01 +0100 Subject: [PATCH 51/66] Make usage of PropertyChangeListeners working (addendum to previous commit) --- .../uka/ilkd/key/settings/ViewSettings.java | 8 +++---- .../HidePackagePrefixToggleAction.java | 7 +++--- .../gui/actions/PrettyPrintToggleAction.java | 10 +++------ .../SyntaxHighlightingToggleAction.java | 22 ++++++++++++++++++- .../key/gui/actions/UnicodeToggleAction.java | 6 ++--- 5 files changed, 35 insertions(+), 18 deletions(-) diff --git a/key.core/src/main/java/de/uka/ilkd/key/settings/ViewSettings.java b/key.core/src/main/java/de/uka/ilkd/key/settings/ViewSettings.java index 57eebb2f49..9fa5efc461 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/settings/ViewSettings.java +++ b/key.core/src/main/java/de/uka/ilkd/key/settings/ViewSettings.java @@ -78,22 +78,22 @@ public class ViewSettings extends AbstractPropertiesSettings { /** * Pretty Syntax is true by default, use Unicode symbols not */ - private static final String PRETTY_SYNTAX = "PrettySyntax"; + public static final String PRETTY_SYNTAX = "PrettySyntax"; /** * */ - private static final String USE_UNICODE = "UseUnicodeSymbols"; + public static final String USE_UNICODE = "UseUnicodeSymbols"; /** * */ - private static final String SYNTAX_HIGHLIGHTING = "SyntaxHighlighting"; + public static final String SYNTAX_HIGHLIGHTING = "SyntaxHighlighting"; /** * */ - private static final String HIDE_PACKAGE_PREFIX = "HidePackagePrefix"; + public static final String HIDE_PACKAGE_PREFIX = "HidePackagePrefix"; /** * confirm exiting by default diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java index 242fe272ba..30dcac2d02 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java @@ -11,6 +11,7 @@ import de.uka.ilkd.key.gui.MainWindow; import de.uka.ilkd.key.pp.NotationInfo; import de.uka.ilkd.key.settings.ProofIndependentSettings; +import de.uka.ilkd.key.settings.ViewSettings; public final class HidePackagePrefixToggleAction extends MainWindowAction { public static final String NAME = "Hide Package Prefix"; @@ -36,7 +37,7 @@ public HidePackagePrefixToggleAction(MainWindow mainWindow) { // removed, because there is only one // MainWindow! ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings() - .addPropertyChangeListener(viewSettingsListener); + .addPropertyChangeListener(ViewSettings.HIDE_PACKAGE_PREFIX, viewSettingsListener); updateSelectedState(); } @@ -57,8 +58,8 @@ public void actionPerformed(ActionEvent e) { ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().setHidePackagePrefix(selected); } - private void handleViewSettingsChanged(PropertyChangeEvent e) { - if (NAME.equals(e.getPropertyName())) { + protected void handleViewSettingsChanged(PropertyChangeEvent e) { + if (ViewSettings.HIDE_PACKAGE_PREFIX.equals(e.getPropertyName())) { updateSelectedState(); mainWindow.makePrettyView(); } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java index 8f2dea8c77..da885e019d 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java @@ -12,6 +12,7 @@ import de.uka.ilkd.key.gui.MainWindow; import de.uka.ilkd.key.pp.NotationInfo; import de.uka.ilkd.key.settings.ProofIndependentSettings; +import de.uka.ilkd.key.settings.ViewSettings; public class PrettyPrintToggleAction extends MainWindowAction { public static final String NAME = "Use Pretty Syntax"; @@ -25,9 +26,6 @@ public class PrettyPrintToggleAction extends MainWindowAction { /** * Listens for changes on {@code ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings()}. - *

- * Such changes can occur in the Eclipse context when settings are changed in for instance the - * KeYIDE. */ private final PropertyChangeListener viewSettingsListener = this::handleViewSettingsChanged; @@ -39,7 +37,7 @@ public PrettyPrintToggleAction(MainWindow mainWindow) { // removed, because there is only one // MainWindow! ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings() - .addPropertyChangeListener(viewSettingsListener); + .addPropertyChangeListener(ViewSettings.PRETTY_SYNTAX, viewSettingsListener); updateSelectedState(); } @@ -48,7 +46,6 @@ protected void updateSelectedState() { ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().isUsePretty(); NotationInfo.DEFAULT_PRETTY_SYNTAX = prettySyntax; setSelected(prettySyntax); - // setSelected(NotationInfo.PRETTY_SYNTAX); } @Override @@ -58,7 +55,6 @@ public void actionPerformed(ActionEvent e) { // will react on the settings change event! NotationInfo.DEFAULT_PRETTY_SYNTAX = selected; ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().setUsePretty(selected); - updateMainWindow(selected); } protected void updateMainWindow(boolean prettySyntax) { @@ -68,7 +64,7 @@ protected void updateMainWindow(boolean prettySyntax) { } protected void handleViewSettingsChanged(PropertyChangeEvent e) { - if (NAME.equals(e.getPropertyName())) { + if (ViewSettings.PRETTY_SYNTAX.equals(e.getPropertyName())) { updateSelectedState(); final boolean prettySyntax = ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().isUsePretty(); diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/SyntaxHighlightingToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/SyntaxHighlightingToggleAction.java index c0a6241677..8af6f19c21 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/SyntaxHighlightingToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/SyntaxHighlightingToggleAction.java @@ -4,14 +4,24 @@ package de.uka.ilkd.key.gui.actions; import java.awt.event.ActionEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import javax.swing.JCheckBoxMenuItem; import de.uka.ilkd.key.gui.MainWindow; import de.uka.ilkd.key.settings.ProofIndependentSettings; +import static de.uka.ilkd.key.settings.ViewSettings.SYNTAX_HIGHLIGHTING; + public class SyntaxHighlightingToggleAction extends MainWindowAction { private static final long serialVersionUID = 6987252955535709994L; + /** + * Listens for changes on {@code ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings()}. + */ + private final PropertyChangeListener syntaxHighlightingListener = + this::handleViewSettingsChanged; + public SyntaxHighlightingToggleAction(MainWindow window) { super(window); setName("Use Syntax Highlighting"); @@ -20,6 +30,11 @@ public SyntaxHighlightingToggleAction(MainWindow window) { + "slow down the rendering of longer ones."); final boolean useSyntaxHighlighting = ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().isUseSyntaxHighlighting(); + // Attention: The listener is never + // removed, because there is only one + // MainWindow! + ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings() + .addPropertyChangeListener(SYNTAX_HIGHLIGHTING, syntaxHighlightingListener); setSelected(useSyntaxHighlighting); } @@ -28,7 +43,12 @@ public void actionPerformed(ActionEvent e) { boolean useSyntaxHighlighting = ((JCheckBoxMenuItem) e.getSource()).isSelected(); ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings() .setUseSyntaxHighlighting(useSyntaxHighlighting); - mainWindow.makePrettyView(); + setSelected(useSyntaxHighlighting); } + protected void handleViewSettingsChanged(PropertyChangeEvent e) { + if (SYNTAX_HIGHLIGHTING.equals(e.getPropertyName())) { + mainWindow.makePrettyView(); + } + } } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java index 41a5632e8e..7346ebf4b9 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java @@ -11,6 +11,7 @@ import de.uka.ilkd.key.gui.MainWindow; import de.uka.ilkd.key.pp.NotationInfo; import de.uka.ilkd.key.settings.ProofIndependentSettings; +import de.uka.ilkd.key.settings.ViewSettings; import de.uka.ilkd.key.util.UnicodeHelper; public class UnicodeToggleAction extends MainWindowAction { @@ -38,7 +39,7 @@ public UnicodeToggleAction(MainWindow window) { // Attention: The listener is never// removed, because there is only one // MainWindow! ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings() - .addPropertyChangeListener(viewSettingsListener); + .addPropertyChangeListener(ViewSettings.USE_UNICODE, viewSettingsListener); updateSelectedState(); } @@ -64,7 +65,6 @@ public void actionPerformed(ActionEvent e) { // UI will react on the // settings change event! ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().setUseUnicode(useUnicode); - updateMainWindow(); } protected void updateMainWindow() { @@ -72,7 +72,7 @@ protected void updateMainWindow() { } protected void handleViewSettingsChanged(PropertyChangeEvent e) { - if (NAME.equals(e.getPropertyName())) { + if (ViewSettings.USE_UNICODE.equals(e.getPropertyName())) { updateSelectedState(); updateMainWindow(); } From ddd3a31150c0d0010a7c0050baee976f8cbb4450 Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Sat, 2 Dec 2023 13:24:06 +0100 Subject: [PATCH 52/66] Remove unnecessary checks for correct change as listener is now registered correctly only for changes of interest --- .../key/gui/actions/HidePackagePrefixToggleAction.java | 6 ++---- .../ilkd/key/gui/actions/PrettyPrintToggleAction.java | 10 ++++------ .../gui/actions/SyntaxHighlightingToggleAction.java | 4 +--- .../uka/ilkd/key/gui/actions/UnicodeToggleAction.java | 6 ++---- 4 files changed, 9 insertions(+), 17 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java index 30dcac2d02..ef96eaf860 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/HidePackagePrefixToggleAction.java @@ -59,10 +59,8 @@ public void actionPerformed(ActionEvent e) { } protected void handleViewSettingsChanged(PropertyChangeEvent e) { - if (ViewSettings.HIDE_PACKAGE_PREFIX.equals(e.getPropertyName())) { - updateSelectedState(); - mainWindow.makePrettyView(); - } + updateSelectedState(); + mainWindow.makePrettyView(); } } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java index da885e019d..357e31ac19 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/PrettyPrintToggleAction.java @@ -64,11 +64,9 @@ protected void updateMainWindow(boolean prettySyntax) { } protected void handleViewSettingsChanged(PropertyChangeEvent e) { - if (ViewSettings.PRETTY_SYNTAX.equals(e.getPropertyName())) { - updateSelectedState(); - final boolean prettySyntax = - ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().isUsePretty(); - updateMainWindow(prettySyntax); - } + updateSelectedState(); + final boolean prettySyntax = + ProofIndependentSettings.DEFAULT_INSTANCE.getViewSettings().isUsePretty(); + updateMainWindow(prettySyntax); } } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/SyntaxHighlightingToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/SyntaxHighlightingToggleAction.java index 8af6f19c21..03654fa2d1 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/SyntaxHighlightingToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/SyntaxHighlightingToggleAction.java @@ -47,8 +47,6 @@ public void actionPerformed(ActionEvent e) { } protected void handleViewSettingsChanged(PropertyChangeEvent e) { - if (SYNTAX_HIGHLIGHTING.equals(e.getPropertyName())) { - mainWindow.makePrettyView(); - } + mainWindow.makePrettyView(); } } diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java index 7346ebf4b9..e5a3b0c1c4 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/actions/UnicodeToggleAction.java @@ -72,9 +72,7 @@ protected void updateMainWindow() { } protected void handleViewSettingsChanged(PropertyChangeEvent e) { - if (ViewSettings.USE_UNICODE.equals(e.getPropertyName())) { - updateSelectedState(); - updateMainWindow(); - } + updateSelectedState(); + updateMainWindow(); } } From c03f1c2469862757694e5938e825956ca6b350bf Mon Sep 17 00:00:00 2001 From: Richard Bubel Date: Fri, 8 Dec 2023 22:25:59 +0100 Subject: [PATCH 53/66] Fix selection highlight for OSS node child This commit fixes also exceptions when activating a filter like "Hide Closed Subtrees" when an OSS child node was selected. --- .../uka/ilkd/key/core/KeYSelectionModel.java | 2 +- .../ilkd/key/gui/prooftree/GUIBranchNode.java | 6 +-- .../ilkd/key/gui/prooftree/ProofTreeView.java | 39 ++++++++++++++++--- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/core/KeYSelectionModel.java b/key.ui/src/main/java/de/uka/ilkd/key/core/KeYSelectionModel.java index cf18650a59..b3a72e3f86 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/core/KeYSelectionModel.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/core/KeYSelectionModel.java @@ -149,7 +149,7 @@ public synchronized void setSelectedSequentAndRuleApp(Node node, Sequent sequent selectedNode = node; selectedSequent = sequent; selectedRuleApp = ruleApp; - fireSelectedNodeChanged(node); + fireSelectedNodeChanged(previousNode); } /** diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIBranchNode.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIBranchNode.java index e66df61c63..0aeac640d2 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIBranchNode.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/GUIBranchNode.java @@ -2,9 +2,6 @@ * KeY is licensed under the GNU General Public License Version 2 * SPDX-License-Identifier: GPL-2.0-only */ package de.uka.ilkd.key.gui.prooftree; -/** - * this class implements a TreeModel that can be displayed using the JTree class framework - */ import java.util.ArrayList; import javax.swing.tree.TreeNode; @@ -13,6 +10,9 @@ import org.jspecify.annotations.NonNull; +/** + * this class implements a TreeModel that can be displayed using the JTree class framework + */ class GUIBranchNode extends GUIAbstractTreeNode implements TreeNode { private final Object label; diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java index 60ea08d8ab..56c2c23c85 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java @@ -32,6 +32,7 @@ import de.uka.ilkd.key.gui.keyshortcuts.KeyStrokeManager; import de.uka.ilkd.key.java.Services; import de.uka.ilkd.key.logic.PosInOccurrence; +import de.uka.ilkd.key.logic.Sequent; import de.uka.ilkd.key.pp.LogicPrinter; import de.uka.ilkd.key.pp.PrettyPrinter; import de.uka.ilkd.key.proof.*; @@ -570,7 +571,25 @@ public void makeNodeVisible(Node n) { if (node == null) { return; } + TreeNode[] obs = node.getPath(); + + if (n.sequent() != mediator.getSelectionModel().getSelectedSequent()) { + // in this case we have to select a child of an OSS node + ArrayList pathToOSSChild = new ArrayList<>(); + pathToOSSChild.addAll(Arrays.asList(obs)); + for (int i = 0; i Date: Fri, 8 Dec 2023 22:39:05 +0100 Subject: [PATCH 54/66] Spotless cleanups --- .../ilkd/key/gui/prooftree/ProofTreeView.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java index 56c2c23c85..d0361823e1 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/prooftree/ProofTreeView.java @@ -32,7 +32,6 @@ import de.uka.ilkd.key.gui.keyshortcuts.KeyStrokeManager; import de.uka.ilkd.key.java.Services; import de.uka.ilkd.key.logic.PosInOccurrence; -import de.uka.ilkd.key.logic.Sequent; import de.uka.ilkd.key.pp.LogicPrinter; import de.uka.ilkd.key.pp.PrettyPrinter; import de.uka.ilkd.key.proof.*; @@ -578,10 +577,10 @@ public void makeNodeVisible(Node n) { // in this case we have to select a child of an OSS node ArrayList pathToOSSChild = new ArrayList<>(); pathToOSSChild.addAll(Arrays.asList(obs)); - for (int i = 0; i Date: Sun, 10 Dec 2023 06:28:18 +0100 Subject: [PATCH 55/66] Configurable enabled keys for JML condition evaluation --- .../ilkd/key/settings/GeneralSettings.java | 47 ++++++++++++++++++- .../key/speclang/njml/JmlMarkerDecision.java | 3 +- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/key.core/src/main/java/de/uka/ilkd/key/settings/GeneralSettings.java b/key.core/src/main/java/de/uka/ilkd/key/settings/GeneralSettings.java index 74dbbb5c0f..ab4cdd39d3 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/settings/GeneralSettings.java +++ b/key.core/src/main/java/de/uka/ilkd/key/settings/GeneralSettings.java @@ -3,10 +3,15 @@ * SPDX-License-Identifier: GPL-2.0-only */ package de.uka.ilkd.key.settings; -import java.util.Properties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; public class GeneralSettings extends AbstractSettings { + private static final Logger LOGGER = LoggerFactory.getLogger(GeneralSettings.class); + /** * This parameter disables the possibility to prune in closed branches. It is meant as a * fallback solution if storing all closed goals needs too much memory or is not needed. Pruning @@ -32,6 +37,9 @@ public class GeneralSettings extends AbstractSettings { private static final String TACLET_FILTER = "StupidMode"; private static final String DND_DIRECTION_SENSITIVE_KEY = "DnDDirectionSensitive"; private static final String USE_JML_KEY = "UseJML"; + + private static final String KEY_JML_ENABLED_KEYS = "JML_ENABLED_KEYS"; + private static final String RIGHT_CLICK_MACROS_KEY = "RightClickMacros"; private static final String AUTO_SAVE = "AutoSavePeriod"; @@ -40,6 +48,8 @@ public class GeneralSettings extends AbstractSettings { */ private static final String ENSURE_SOURCE_CONSISTENCY = "EnsureSourceConsistency"; + private Set jmlEnabledKeys = new TreeSet<>(Set.of("key")); + /** * minimize interaction is on by default */ @@ -75,7 +85,16 @@ public class GeneralSettings extends AbstractSettings { // addSettingsListener(AutoSaver.settingsListener); } - // getter + public Set getJmlEnabledKeys() { + return jmlEnabledKeys; + } + + public void setJmlEnabledKeys(Set jmlEnabledKeys) { + var oldValue = this.jmlEnabledKeys; + this.jmlEnabledKeys = Objects.requireNonNull(jmlEnabledKeys); + firePropertyChange(KEY_JML_ENABLED_KEYS, oldValue, jmlEnabledKeys); + } + public boolean getTacletFilter() { return tacletFilter; } @@ -185,6 +204,20 @@ public void readSettings(Properties props) { if (val != null) { setEnsureSourceConsistency(Boolean.parseBoolean(val)); } + + { + var sysProp = System.getProperty(KEY_JML_ENABLED_KEYS); + if (sysProp != null) { + val = sysProp; + LOGGER.warn("Use system property -P{}={}", KEY_JML_ENABLED_KEYS, sysProp); + }else { + val = props.getProperty(prefix + KEY_JML_ENABLED_KEYS); + } + + if (val != null) { + setJmlEnabledKeys(new TreeSet<>(Arrays.stream(val.split(",")).toList())); + } + } } /** @@ -205,6 +238,7 @@ public void writeSettings(Properties props) { props.setProperty(prefix + AUTO_SAVE, String.valueOf(autoSave)); props.setProperty(prefix + ENSURE_SOURCE_CONSISTENCY, String.valueOf(ensureSourceConsistency)); + props.setProperty(KEY_JML_ENABLED_KEYS, String.join(",", jmlEnabledKeys)); } @Override @@ -222,6 +256,14 @@ public void readSettings(Configuration props) { setAutoSave(0); } setEnsureSourceConsistency(props.getBool(ENSURE_SOURCE_CONSISTENCY)); + + var sysProp = System.getProperty(KEY_JML_ENABLED_KEYS); + if (sysProp != null) { + LOGGER.warn("Use system property -P{}={}", KEY_JML_ENABLED_KEYS, sysProp); + setJmlEnabledKeys(new TreeSet<>(Arrays.stream(sysProp.split(",")).toList())); + }else { + setJmlEnabledKeys(new TreeSet<>(props.getStringList(KEY_JML_ENABLED_KEYS))); + } } @Override @@ -232,5 +274,6 @@ public void writeSettings(Configuration props) { props.set(USE_JML_KEY, useJML); props.set(AUTO_SAVE, autoSave); props.set(ENSURE_SOURCE_CONSISTENCY, ensureSourceConsistency); + props.set(KEY_JML_ENABLED_KEYS, jmlEnabledKeys.stream().toList()); } } diff --git a/key.core/src/main/java/de/uka/ilkd/key/speclang/njml/JmlMarkerDecision.java b/key.core/src/main/java/de/uka/ilkd/key/speclang/njml/JmlMarkerDecision.java index 1651ecfad6..126ec6ecf9 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/speclang/njml/JmlMarkerDecision.java +++ b/key.core/src/main/java/de/uka/ilkd/key/speclang/njml/JmlMarkerDecision.java @@ -9,6 +9,7 @@ import java.util.Set; import java.util.stream.Collectors; +import de.uka.ilkd.key.settings.ProofIndependentSettings; import org.jspecify.annotations.NonNull; /** @@ -29,7 +30,7 @@ public class JmlMarkerDecision { */ public JmlMarkerDecision(JmlLexer lexer) { this.lexer = lexer; - enabledKeys.add("key"); + setEnabledKeys(ProofIndependentSettings.DEFAULT_INSTANCE.getGeneralSettings().getJmlEnabledKeys()); } /** From 40c2a2b51693fe9dc9edadcc07c4af1eeeb7a5ec Mon Sep 17 00:00:00 2001 From: Mattias Ulbrich Date: Wed, 20 Dec 2023 15:45:35 +0100 Subject: [PATCH 56/66] applying spotless --- .../java/de/uka/ilkd/key/settings/GeneralSettings.java | 10 +++++----- .../uka/ilkd/key/speclang/njml/JmlMarkerDecision.java | 4 +++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/key.core/src/main/java/de/uka/ilkd/key/settings/GeneralSettings.java b/key.core/src/main/java/de/uka/ilkd/key/settings/GeneralSettings.java index ab4cdd39d3..44d162edb0 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/settings/GeneralSettings.java +++ b/key.core/src/main/java/de/uka/ilkd/key/settings/GeneralSettings.java @@ -3,11 +3,11 @@ * SPDX-License-Identifier: GPL-2.0-only */ package de.uka.ilkd.key.settings; +import java.util.*; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.*; - public class GeneralSettings extends AbstractSettings { private static final Logger LOGGER = LoggerFactory.getLogger(GeneralSettings.class); @@ -206,11 +206,11 @@ public void readSettings(Properties props) { } { - var sysProp = System.getProperty(KEY_JML_ENABLED_KEYS); + String sysProp = System.getProperty(KEY_JML_ENABLED_KEYS); if (sysProp != null) { val = sysProp; LOGGER.warn("Use system property -P{}={}", KEY_JML_ENABLED_KEYS, sysProp); - }else { + } else { val = props.getProperty(prefix + KEY_JML_ENABLED_KEYS); } @@ -261,7 +261,7 @@ public void readSettings(Configuration props) { if (sysProp != null) { LOGGER.warn("Use system property -P{}={}", KEY_JML_ENABLED_KEYS, sysProp); setJmlEnabledKeys(new TreeSet<>(Arrays.stream(sysProp.split(",")).toList())); - }else { + } else { setJmlEnabledKeys(new TreeSet<>(props.getStringList(KEY_JML_ENABLED_KEYS))); } } diff --git a/key.core/src/main/java/de/uka/ilkd/key/speclang/njml/JmlMarkerDecision.java b/key.core/src/main/java/de/uka/ilkd/key/speclang/njml/JmlMarkerDecision.java index 126ec6ecf9..555a64bbde 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/speclang/njml/JmlMarkerDecision.java +++ b/key.core/src/main/java/de/uka/ilkd/key/speclang/njml/JmlMarkerDecision.java @@ -10,6 +10,7 @@ import java.util.stream.Collectors; import de.uka.ilkd.key.settings.ProofIndependentSettings; + import org.jspecify.annotations.NonNull; /** @@ -30,7 +31,8 @@ public class JmlMarkerDecision { */ public JmlMarkerDecision(JmlLexer lexer) { this.lexer = lexer; - setEnabledKeys(ProofIndependentSettings.DEFAULT_INSTANCE.getGeneralSettings().getJmlEnabledKeys()); + setEnabledKeys( + ProofIndependentSettings.DEFAULT_INSTANCE.getGeneralSettings().getJmlEnabledKeys()); } /** From 24b86ef7a1f6fbfc1701f766f9068b2f16861e4d Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Tue, 26 Dec 2023 03:11:33 +0100 Subject: [PATCH 57/66] bug fix --- .../de/uka/ilkd/key/settings/AbstractPropertiesSettings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/key.core/src/main/java/de/uka/ilkd/key/settings/AbstractPropertiesSettings.java b/key.core/src/main/java/de/uka/ilkd/key/settings/AbstractPropertiesSettings.java index c39e552b02..08a82f320a 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/settings/AbstractPropertiesSettings.java +++ b/key.core/src/main/java/de/uka/ilkd/key/settings/AbstractPropertiesSettings.java @@ -270,7 +270,7 @@ public String value() { @Override public T fromObject(@Nullable Object o) { - return null; + return fromObject.apply(o); } } } From 9c0f01f83a8798c13ae392e0263737077db5416a Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Thu, 28 Dec 2023 00:56:40 +0100 Subject: [PATCH 58/66] ignore files in */antlr4/gen/* --- .gitignore | 3 + key.core/src/main/antlr4/gen/KeYLexer.java | 1985 -------------------- 2 files changed, 3 insertions(+), 1985 deletions(-) delete mode 100644 key.core/src/main/antlr4/gen/KeYLexer.java diff --git a/.gitignore b/.gitignore index dd6a046739..a39af73d29 100644 --- a/.gitignore +++ b/.gitignore @@ -65,5 +65,8 @@ key.core/src/main/resources/de/uka/ilkd/key/smt/solvertypes/solvers.txt key/key.ui/examples/**/**.proof **/testresults/** +# generated by the antlr plugin of IntelliJ +key.core/src/main/antlr4/gen/ + scripts/tools/checkstyle/key_checks_incremental.xml checkstyle-diff.txt diff --git a/key.core/src/main/antlr4/gen/KeYLexer.java b/key.core/src/main/antlr4/gen/KeYLexer.java deleted file mode 100644 index 8546159dee..0000000000 --- a/key.core/src/main/antlr4/gen/KeYLexer.java +++ /dev/null @@ -1,1985 +0,0 @@ -// Generated from java-escape by ANTLR 4.11.1 - - import java.util.HashMap; - import java.util.LinkedHashMap; - -import org.antlr.v4.runtime.Lexer; -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.TokenStream; -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.atn.*; -import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.misc.*; - -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) -public class KeYLexer extends Lexer { - static { RuntimeMetaData.checkVersion("4.11.1", RuntimeMetaData.VERSION); } - - protected static final DFA[] _decisionToDFA; - protected static final PredictionContextCache _sharedContextCache = - new PredictionContextCache(); - public static final int - MODALITY=1, SORTS=2, GENERIC=3, PROXY=4, EXTENDS=5, ONEOF=6, ABSTRACT=7, - SCHEMAVARIABLES=8, SCHEMAVAR=9, MODALOPERATOR=10, PROGRAM=11, FORMULA=12, - TERM=13, UPDATE=14, VARIABLES=15, VARIABLE=16, SKOLEMTERM=17, SKOLEMFORMULA=18, - TERMLABEL=19, MODIFIES=20, PROGRAMVARIABLES=21, STORE_TERM_IN=22, STORE_STMT_IN=23, - HAS_INVARIANT=24, GET_INVARIANT=25, GET_FREE_INVARIANT=26, GET_VARIANT=27, - IS_LABELED=28, SAME_OBSERVER=29, VARCOND=30, APPLY_UPDATE_ON_RIGID=31, - DEPENDINGON=32, DISJOINTMODULONULL=33, DROP_EFFECTLESS_ELEMENTARIES=34, - DROP_EFFECTLESS_STORES=35, SIMPLIFY_IF_THEN_ELSE_UPDATE=36, ENUM_CONST=37, - FREELABELIN=38, HASSORT=39, FIELDTYPE=40, FINAL=41, ELEMSORT=42, HASLABEL=43, - HASSUBFORMULAS=44, ISARRAY=45, ISARRAYLENGTH=46, ISCONSTANT=47, ISENUMTYPE=48, - ISINDUCTVAR=49, ISLOCALVARIABLE=50, ISOBSERVER=51, DIFFERENT=52, METADISJOINT=53, - ISTHISREFERENCE=54, DIFFERENTFIELDS=55, ISREFERENCE=56, ISREFERENCEARRAY=57, - ISSTATICFIELD=58, ISINSTRICTFP=59, ISSUBTYPE=60, EQUAL_UNIQUE=61, NEW=62, - NEW_TYPE_OF=63, NEW_DEPENDING_ON=64, HAS_ELEMENTARY_SORT=65, NEWLABEL=66, - CONTAINS_ASSIGNMENT=67, NOT_=68, NOTFREEIN=69, SAME=70, STATIC=71, STATICMETHODREFERENCE=72, - MAXEXPANDMETHOD=73, STRICT=74, TYPEOF=75, INSTANTIATE_GENERIC=76, FORALL=77, - EXISTS=78, SUBST=79, IF=80, IFEX=81, THEN=82, ELSE=83, INCLUDE=84, INCLUDELDTS=85, - CLASSPATH=86, BOOTCLASSPATH=87, NODEFAULTCLASSES=88, JAVASOURCE=89, WITHOPTIONS=90, - OPTIONSDECL=91, KEYSETTINGS=92, PROFILE=93, TRUE=94, FALSE=95, SAMEUPDATELEVEL=96, - INSEQUENTSTATE=97, ANTECEDENTPOLARITY=98, SUCCEDENTPOLARITY=99, CLOSEGOAL=100, - HEURISTICSDECL=101, NONINTERACTIVE=102, DISPLAYNAME=103, HELPTEXT=104, - REPLACEWITH=105, ADDRULES=106, ADDPROGVARS=107, HEURISTICS=108, FIND=109, - ADD=110, ASSUMES=111, TRIGGER=112, AVOID=113, PREDICATES=114, FUNCTIONS=115, - TRANSFORMERS=116, UNIQUE=117, RULES=118, AXIOMS=119, PROBLEM=120, CHOOSECONTRACT=121, - PROOFOBLIGATION=122, PROOF=123, PROOFSCRIPT=124, CONTRACTS=125, INVARIANTS=126, - LEMMA=127, IN_TYPE=128, IS_ABSTRACT_OR_INTERFACE=129, CONTAINERTYPE=130, - UTF_PRECEDES=131, UTF_IN=132, UTF_EMPTY=133, UTF_UNION=134, UTF_INTERSECT=135, - UTF_SUBSET=136, UTF_SETMINUS=137, SEMI=138, SLASH=139, COLON=140, DOUBLECOLON=141, - ASSIGN=142, DOT=143, DOTRANGE=144, COMMA=145, LPAREN=146, RPAREN=147, - LBRACE=148, RBRACE=149, LBRACKET=150, RBRACKET=151, EMPTYBRACKETS=152, - AT=153, PARALLEL=154, OR=155, AND=156, NOT=157, IMP=158, EQUALS=159, NOT_EQUALS=160, - SEQARROW=161, EXP=162, TILDE=163, PERCENT=164, STAR=165, MINUS=166, PLUS=167, - GREATER=168, GREATEREQUAL=169, RGUILLEMETS=170, WS=171, STRING_LITERAL=172, - LESS=173, LESSEQUAL=174, LGUILLEMETS=175, EQV=176, PRIMES=177, CHAR_LITERAL=178, - QUOTED_STRING_LITERAL=179, SL_COMMENT=180, BIN_LITERAL=181, HEX_LITERAL=182, - IDENT=183, INT_LITERAL=184, FLOAT_LITERAL=185, DOUBLE_LITERAL=186, REAL_LITERAL=187, - ERROR_CHAR=188, COMMENT_END=189, DOC_COMMENT=190, ML_COMMENT=191, MODALITYD=192, - MODALITYB=193, MODALITYBB=194, MODAILITYGENERIC1=195, MODAILITYGENERIC2=196, - MODAILITYGENERIC3=197, MODAILITYGENERIC4=198, MODAILITYGENERIC5=199, MODAILITYGENERIC6=200, - MODAILITYGENERIC7=201, MODALITYD_END=202, MODALITYD_STRING=203, MODALITYD_CHAR=204, - MODALITYG_END=205, MODALITYB_END=206, MODALITYBB_END=207; - public static final int - modDiamond=1, modGeneric=2, modBox=3, modBoxBox=4, modString=5, modChar=6, - modComment=7, COMMENT=8, docComment=9; - public static String[] channelNames = { - "DEFAULT_TOKEN_CHANNEL", "HIDDEN" - }; - - public static String[] modeNames = { - "DEFAULT_MODE", "modDiamond", "modGeneric", "modBox", "modBoxBox", "modString", - "modChar", "modComment", "COMMENT", "docComment" - }; - - private static String[] makeRuleNames() { - return new String[] { - "SORTS", "GENERIC", "PROXY", "EXTENDS", "ONEOF", "ABSTRACT", "SCHEMAVARIABLES", - "SCHEMAVAR", "MODALOPERATOR", "PROGRAM", "FORMULA", "TERM", "UPDATE", - "VARIABLES", "VARIABLE", "SKOLEMTERM", "SKOLEMFORMULA", "TERMLABEL", - "MODIFIES", "PROGRAMVARIABLES", "STORE_TERM_IN", "STORE_STMT_IN", "HAS_INVARIANT", - "GET_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", "ISINSTRICTFP", "ISSUBTYPE", "EQUAL_UNIQUE", - "NEW", "NEW_TYPE_OF", "NEW_DEPENDING_ON", "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", "TRUE", "FALSE", "SAMEUPDATELEVEL", - "INSEQUENTSTATE", "ANTECEDENTPOLARITY", "SUCCEDENTPOLARITY", "CLOSEGOAL", - "HEURISTICSDECL", "NONINTERACTIVE", "DISPLAYNAME", "HELPTEXT", "REPLACEWITH", - "ADDRULES", "ADDPROGVARS", "HEURISTICS", "FIND", "ADD", "ASSUMES", "TRIGGER", - "AVOID", "PREDICATES", "FUNCTIONS", "TRANSFORMERS", "UNIQUE", "RULES", - "AXIOMS", "PROBLEM", "CHOOSECONTRACT", "PROOFOBLIGATION", "PROOF", "PROOFSCRIPT", - "CONTRACTS", "INVARIANTS", "LEMMA", "IN_TYPE", "IS_ABSTRACT_OR_INTERFACE", - "CONTAINERTYPE", "UTF_PRECEDES", "UTF_IN", "UTF_EMPTY", "UTF_UNION", - "UTF_INTERSECT", "UTF_SUBSET", "UTF_SETMINUS", "VOCAB", "SEMI", "SLASH", - "COLON", "DOUBLECOLON", "ASSIGN", "DOT", "DOTRANGE", "COMMA", "LPAREN", - "RPAREN", "LBRACE", "RBRACE", "LBRACKET", "RBRACKET", "EMPTYBRACKETS", - "AT", "PARALLEL", "OR", "AND", "NOT", "IMP", "EQUALS", "NOT_EQUALS", - "SEQARROW", "EXP", "TILDE", "PERCENT", "STAR", "MINUS", "PLUS", "GREATER", - "GREATEREQUAL", "RGUILLEMETS", "WS", "STRING_LITERAL", "LESS", "LESSEQUAL", - "LGUILLEMETS", "IMPLICIT_IDENT", "EQV", "PRIMES", "CHAR_LITERAL", "QUOTED_STRING_LITERAL", - "SL_COMMENT", "DOC_COMMENT", "ML_COMMENT", "BIN_LITERAL", "HEX_LITERAL", - "DIGIT", "HEX", "LETTER", "IDCHAR", "IDENT", "INT_LITERAL", "EXP_SUFFIX", - "RATIONAL_LITERAL", "FLOAT_LITERAL", "DOUBLE_LITERAL", "REAL_LITERAL", - "MODALITYD", "MODALITYB", "MODALITYBB", "MODAILITYGENERIC1", "MODAILITYGENERIC2", - "MODAILITYGENERIC3", "MODAILITYGENERIC4", "MODAILITYGENERIC5", "MODAILITYGENERIC6", - "MODAILITYGENERIC7", "ERROR_CHAR", "MODALITYD_END", "MODALITYD_STRING", - "MODALITYD_CHAR", "MODALITYD_COMMENT", "MODALITYD_ANY", "MODALITYG_END", - "MODALITYG_STRING", "MODALITYG_CHAR", "MODALITYG_COMMENT", "MODALITYG_ANY", - "MODALITYB_END", "MODALITYB_STRING", "MODALITYB_CHAR", "MODALITYB_COMMENT", - "MODALITYB_ANY", "MODALITYBB_END", "MODALITYBB_STRING", "MODALITYBB_CHAR", - "MODALITYBB_COMMENT", "MODALITYBB_ANY", "MOD_STRING_ESC", "MOD_STRING_END", - "MOD_STRING_ANY", "MOD_CHAR_END", "MOD_CHAR_ANY", "MOD_COMMENT_END", - "MOD_COMMENT_ANY", "COMMENT_END", "COMMENT_ANY_CHAR", "DOC_COMMENT_END", - "DOC_COMMENT_ANY_CHAR" - }; - } - public static final String[] ruleNames = makeRuleNames(); - - private static String[] makeLiteralNames() { - return new String[] { - null, null, "'\\sorts'", "'\\generic'", "'\\proxy'", "'\\extends'", "'\\oneof'", - "'\\abstract'", "'\\schemaVariables'", "'\\schemaVar'", "'\\modalOperator'", - "'\\program'", "'\\formula'", "'\\term'", "'\\update'", "'\\variables'", - "'\\variable'", "'\\skolemTerm'", "'\\skolemFormula'", "'\\termlabel'", - "'\\modifies'", "'\\programVariables'", "'\\storeTermIn'", "'\\storeStmtIn'", - "'\\hasInvariant'", "'\\getInvariant'", "'\\getFreeInvariant'", "'\\getVariant'", - "'\\isLabeled'", "'\\sameObserver'", "'\\varcond'", "'\\applyUpdateOnRigid'", - "'\\dependingOn'", "'\\disjointModuloNull'", "'\\dropEffectlessElementaries'", - "'\\dropEffectlessStores'", "'\\simplifyIfThenElseUpdate'", "'\\enumConstant'", - "'\\freeLabelIn'", "'\\hasSort'", "'\\fieldType'", "'\\final'", "'\\elemSort'", - "'\\hasLabel'", "'\\hasSubFormulas'", "'\\isArray'", "'\\isArrayLength'", - "'\\isConstant'", "'\\isEnumType'", "'\\isInductVar'", "'\\isLocalVariable'", - "'\\isObserver'", "'\\different'", "'\\metaDisjoint'", "'\\isThisReference'", - "'\\differentFields'", "'\\isReference'", "'\\isReferenceArray'", "'\\isStaticField'", - "'\\isInStrictFp'", "'\\sub'", "'\\equalUnique'", "'\\new'", "'\\newTypeOf'", - "'\\newDependingOn'", "'\\hasElementarySort'", "'\\newLabel'", "'\\containsAssignment'", - "'\\not'", "'\\notFreeIn'", "'\\same'", "'\\static'", "'\\staticMethodReference'", - "'\\mayExpandMethod'", "'\\strict'", "'\\typeof'", "'\\instantiateGeneric'", - null, null, "'\\subst'", "'\\if'", "'\\ifEx'", "'\\then'", "'\\else'", - "'\\include'", "'\\includeLDTs'", "'\\classpath'", "'\\bootclasspath'", - "'\\noDefaultClasses'", "'\\javaSource'", "'\\withOptions'", "'\\optionsDecl'", - "'\\settings'", "'\\profile'", "'true'", "'false'", "'\\sameUpdateLevel'", - "'\\inSequentState'", "'\\antecedentPolarity'", "'\\succedentPolarity'", - "'\\closegoal'", "'\\heuristicsDecl'", "'\\noninteractive'", "'\\displayname'", - "'\\helptext'", "'\\replacewith'", "'\\addrules'", "'\\addprogvars'", - "'\\heuristics'", "'\\find'", "'\\add'", "'\\assumes'", "'\\trigger'", - "'\\avoid'", "'\\predicates'", "'\\functions'", "'\\transformers'", "'\\unique'", - "'\\rules'", "'\\axioms'", "'\\problem'", "'\\chooseContract'", "'\\proofObligation'", - "'\\proof'", "'\\proofScript'", "'\\contracts'", "'\\invariants'", "'\\lemma'", - "'\\inType'", "'\\isAbstractOrInterface'", "'\\containerType'", "'\\u227A'", - "'\\u220A'", "'\\u2205'", "'\\u222A'", "'\\u2229'", "'\\u2286'", "'\\u2216'", - "';'", "'/'", "':'", "'::'", "':='", "'.'", null, "','", "'('", "')'", - "'{'", "'}'", "'['", "']'", null, "'@'", null, null, null, null, null, - "'='", null, null, "'^'", "'~'", "'%'", "'*'", "'-'", "'+'", "'>'", null, - null, null, null, "'<'", null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, "'/*!'", "'/*'", "'\\<'", - "'\\['", "'\\[['", "'\\box'", "'\\diamond'", "'\\diamond_transaction'", - "'\\modality'", "'\\box_transaction'", "'\\throughout'", "'\\throughout_transaction'", - "'\\>'", null, null, "'\\endmodality'", "'\\]'", "'\\]]'" - }; - } - private static final String[] _LITERAL_NAMES = makeLiteralNames(); - private static String[] makeSymbolicNames() { - return new String[] { - null, "MODALITY", "SORTS", "GENERIC", "PROXY", "EXTENDS", "ONEOF", "ABSTRACT", - "SCHEMAVARIABLES", "SCHEMAVAR", "MODALOPERATOR", "PROGRAM", "FORMULA", - "TERM", "UPDATE", "VARIABLES", "VARIABLE", "SKOLEMTERM", "SKOLEMFORMULA", - "TERMLABEL", "MODIFIES", "PROGRAMVARIABLES", "STORE_TERM_IN", "STORE_STMT_IN", - "HAS_INVARIANT", "GET_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", "ISINSTRICTFP", "ISSUBTYPE", - "EQUAL_UNIQUE", "NEW", "NEW_TYPE_OF", "NEW_DEPENDING_ON", "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", "TRUE", "FALSE", - "SAMEUPDATELEVEL", "INSEQUENTSTATE", "ANTECEDENTPOLARITY", "SUCCEDENTPOLARITY", - "CLOSEGOAL", "HEURISTICSDECL", "NONINTERACTIVE", "DISPLAYNAME", "HELPTEXT", - "REPLACEWITH", "ADDRULES", "ADDPROGVARS", "HEURISTICS", "FIND", "ADD", - "ASSUMES", "TRIGGER", "AVOID", "PREDICATES", "FUNCTIONS", "TRANSFORMERS", - "UNIQUE", "RULES", "AXIOMS", "PROBLEM", "CHOOSECONTRACT", "PROOFOBLIGATION", - "PROOF", "PROOFSCRIPT", "CONTRACTS", "INVARIANTS", "LEMMA", "IN_TYPE", - "IS_ABSTRACT_OR_INTERFACE", "CONTAINERTYPE", "UTF_PRECEDES", "UTF_IN", - "UTF_EMPTY", "UTF_UNION", "UTF_INTERSECT", "UTF_SUBSET", "UTF_SETMINUS", - "SEMI", "SLASH", "COLON", "DOUBLECOLON", "ASSIGN", "DOT", "DOTRANGE", - "COMMA", "LPAREN", "RPAREN", "LBRACE", "RBRACE", "LBRACKET", "RBRACKET", - "EMPTYBRACKETS", "AT", "PARALLEL", "OR", "AND", "NOT", "IMP", "EQUALS", - "NOT_EQUALS", "SEQARROW", "EXP", "TILDE", "PERCENT", "STAR", "MINUS", - "PLUS", "GREATER", "GREATEREQUAL", "RGUILLEMETS", "WS", "STRING_LITERAL", - "LESS", "LESSEQUAL", "LGUILLEMETS", "EQV", "PRIMES", "CHAR_LITERAL", - "QUOTED_STRING_LITERAL", "SL_COMMENT", "BIN_LITERAL", "HEX_LITERAL", - "IDENT", "INT_LITERAL", "FLOAT_LITERAL", "DOUBLE_LITERAL", "REAL_LITERAL", - "ERROR_CHAR", "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" - }; - } - private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); - public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); - - /** - * @deprecated Use {@link #VOCABULARY} instead. - */ - @Deprecated - public static final String[] tokenNames; - static { - tokenNames = new String[_SYMBOLIC_NAMES.length]; - for (int i = 0; i < tokenNames.length; i++) { - tokenNames[i] = VOCABULARY.getLiteralName(i); - if (tokenNames[i] == null) { - tokenNames[i] = VOCABULARY.getSymbolicName(i); - } - - if (tokenNames[i] == null) { - tokenNames[i] = ""; - } - } - } - - @Override - @Deprecated - public String[] getTokenNames() { - return tokenNames; - } - - @Override - - public Vocabulary getVocabulary() { - return VOCABULARY; - } - - - private String modalityBegin = null; - private String modalityEnd = null; - - private static HashMap modNames = new LinkedHashMap(20); - private static HashMap modPairs = new LinkedHashMap(20); - - static { - modNames.put("\\<","diamond"); - modNames.put("\\diamond","diamond"); - modNames.put("\\diamond_transaction","diamond_transaction"); - modNames.put("\\[","box"); - modNames.put("\\box","box"); - modNames.put("\\box_transaction","box_transaction"); - modNames.put("\\[[","throughout"); - modNames.put("\\throughout","throughout"); - modNames.put("\\throughout_transaction","throughout_transaction"); - - modPairs.put("\\<","\\>"); - modPairs.put("\\[","\\]"); - - //modPairs.put("\\[[","\\]]"); - - modPairs.put("\\modality","\\endmodality"); - modPairs.put("\\diamond","\\endmodality"); - modPairs.put("\\diamond_transaction","\\endmodality"); - modPairs.put("\\box","\\endmodality"); - modPairs.put("\\box_transaction","\\endmodality"); - modPairs.put("\\throughout","\\endmodality"); - modPairs.put("\\throughout_transaction","\\endmodality"); - } - - private Token tokenBackStorage = null; - @Override - public void emit(Token token) { - int MAX_K = 10; - if (token.getType() == INT_LITERAL) {//rewrite INT_LITERALs to identifier when preceeded by an '(' - for (int k = 1; k <= MAX_K; k++) { - int codePoint = _input.LA(k); - if (Character.isWhitespace(codePoint)) continue; - if (codePoint == '(') ((org.antlr.v4.runtime.CommonToken) token).setType(IDENT); - break; - } - } - if(token.getType() == PROOF) { - tokenBackStorage = super.emitEOF(); - //will later be overwritten the EOF token - } - super.emit(token); - } - - @Override - public Token nextToken() { - if(tokenBackStorage!=null) { - Token t = tokenBackStorage; - tokenBackStorage = null; - return t; - } - return super.nextToken(); - } - - - - public KeYLexer(CharStream input) { - super(input); - _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); - } - - @Override - public String getGrammarFileName() { return "KeYLexer.g4"; } - - @Override - public String[] getRuleNames() { return ruleNames; } - - @Override - public String getSerializedATN() { return _serializedATN; } - - @Override - public String[] getChannelNames() { return channelNames; } - - @Override - public String[] getModeNames() { return modeNames; } - - @Override - public ATN getATN() { return _ATN; } - - private static final String _serializedATNSegment0 = - "\u0004\u0000\u00cf\u0a7b\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ - "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ - "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0002\u0000"+ - "\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003"+ - "\u0007\u0003\u0002\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006"+ - "\u0007\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002"+ - "\n\u0007\n\u0002\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002"+ - "\u000e\u0007\u000e\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002"+ - "\u0011\u0007\u0011\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002"+ - "\u0014\u0007\u0014\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002"+ - "\u0017\u0007\u0017\u0002\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002"+ - "\u001a\u0007\u001a\u0002\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002"+ - "\u001d\u0007\u001d\u0002\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002"+ - " \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002"+ - "%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002"+ - "*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002"+ - "/\u0007/\u00020\u00070\u00021\u00071\u00022\u00072\u00023\u00073\u0002"+ - "4\u00074\u00025\u00075\u00026\u00076\u00027\u00077\u00028\u00078\u0002"+ - "9\u00079\u0002:\u0007:\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002"+ - ">\u0007>\u0002?\u0007?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002"+ - "C\u0007C\u0002D\u0007D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002"+ - "H\u0007H\u0002I\u0007I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002"+ - "M\u0007M\u0002N\u0007N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002"+ - "R\u0007R\u0002S\u0007S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002"+ - "W\u0007W\u0002X\u0007X\u0002Y\u0007Y\u0002Z\u0007Z\u0002[\u0007[\u0002"+ - "\\\u0007\\\u0002]\u0007]\u0002^\u0007^\u0002_\u0007_\u0002`\u0007`\u0002"+ - "a\u0007a\u0002b\u0007b\u0002c\u0007c\u0002d\u0007d\u0002e\u0007e\u0002"+ - "f\u0007f\u0002g\u0007g\u0002h\u0007h\u0002i\u0007i\u0002j\u0007j\u0002"+ - "k\u0007k\u0002l\u0007l\u0002m\u0007m\u0002n\u0007n\u0002o\u0007o\u0002"+ - "p\u0007p\u0002q\u0007q\u0002r\u0007r\u0002s\u0007s\u0002t\u0007t\u0002"+ - "u\u0007u\u0002v\u0007v\u0002w\u0007w\u0002x\u0007x\u0002y\u0007y\u0002"+ - "z\u0007z\u0002{\u0007{\u0002|\u0007|\u0002}\u0007}\u0002~\u0007~\u0002"+ - "\u007f\u0007\u007f\u0002\u0080\u0007\u0080\u0002\u0081\u0007\u0081\u0002"+ - "\u0082\u0007\u0082\u0002\u0083\u0007\u0083\u0002\u0084\u0007\u0084\u0002"+ - "\u0085\u0007\u0085\u0002\u0086\u0007\u0086\u0002\u0087\u0007\u0087\u0002"+ - "\u0088\u0007\u0088\u0002\u0089\u0007\u0089\u0002\u008a\u0007\u008a\u0002"+ - "\u008b\u0007\u008b\u0002\u008c\u0007\u008c\u0002\u008d\u0007\u008d\u0002"+ - "\u008e\u0007\u008e\u0002\u008f\u0007\u008f\u0002\u0090\u0007\u0090\u0002"+ - "\u0091\u0007\u0091\u0002\u0092\u0007\u0092\u0002\u0093\u0007\u0093\u0002"+ - "\u0094\u0007\u0094\u0002\u0095\u0007\u0095\u0002\u0096\u0007\u0096\u0002"+ - "\u0097\u0007\u0097\u0002\u0098\u0007\u0098\u0002\u0099\u0007\u0099\u0002"+ - "\u009a\u0007\u009a\u0002\u009b\u0007\u009b\u0002\u009c\u0007\u009c\u0002"+ - "\u009d\u0007\u009d\u0002\u009e\u0007\u009e\u0002\u009f\u0007\u009f\u0002"+ - "\u00a0\u0007\u00a0\u0002\u00a1\u0007\u00a1\u0002\u00a2\u0007\u00a2\u0002"+ - "\u00a3\u0007\u00a3\u0002\u00a4\u0007\u00a4\u0002\u00a5\u0007\u00a5\u0002"+ - "\u00a6\u0007\u00a6\u0002\u00a7\u0007\u00a7\u0002\u00a8\u0007\u00a8\u0002"+ - "\u00a9\u0007\u00a9\u0002\u00aa\u0007\u00aa\u0002\u00ab\u0007\u00ab\u0002"+ - "\u00ac\u0007\u00ac\u0002\u00ad\u0007\u00ad\u0002\u00ae\u0007\u00ae\u0002"+ - "\u00af\u0007\u00af\u0002\u00b0\u0007\u00b0\u0002\u00b1\u0007\u00b1\u0002"+ - "\u00b2\u0007\u00b2\u0002\u00b3\u0007\u00b3\u0002\u00b4\u0007\u00b4\u0002"+ - "\u00b5\u0007\u00b5\u0002\u00b6\u0007\u00b6\u0002\u00b7\u0007\u00b7\u0002"+ - "\u00b8\u0007\u00b8\u0002\u00b9\u0007\u00b9\u0002\u00ba\u0007\u00ba\u0002"+ - "\u00bb\u0007\u00bb\u0002\u00bc\u0007\u00bc\u0002\u00bd\u0007\u00bd\u0002"+ - "\u00be\u0007\u00be\u0002\u00bf\u0007\u00bf\u0002\u00c0\u0007\u00c0\u0002"+ - "\u00c1\u0007\u00c1\u0002\u00c2\u0007\u00c2\u0002\u00c3\u0007\u00c3\u0002"+ - "\u00c4\u0007\u00c4\u0002\u00c5\u0007\u00c5\u0002\u00c6\u0007\u00c6\u0002"+ - "\u00c7\u0007\u00c7\u0002\u00c8\u0007\u00c8\u0002\u00c9\u0007\u00c9\u0002"+ - "\u00ca\u0007\u00ca\u0002\u00cb\u0007\u00cb\u0002\u00cc\u0007\u00cc\u0002"+ - "\u00cd\u0007\u00cd\u0002\u00ce\u0007\u00ce\u0002\u00cf\u0007\u00cf\u0002"+ - "\u00d0\u0007\u00d0\u0002\u00d1\u0007\u00d1\u0002\u00d2\u0007\u00d2\u0002"+ - "\u00d3\u0007\u00d3\u0002\u00d4\u0007\u00d4\u0002\u00d5\u0007\u00d5\u0002"+ - "\u00d6\u0007\u00d6\u0002\u00d7\u0007\u00d7\u0002\u00d8\u0007\u00d8\u0002"+ - "\u00d9\u0007\u00d9\u0002\u00da\u0007\u00da\u0002\u00db\u0007\u00db\u0002"+ - "\u00dc\u0007\u00dc\u0002\u00dd\u0007\u00dd\u0002\u00de\u0007\u00de\u0002"+ - "\u00df\u0007\u00df\u0002\u00e0\u0007\u00e0\u0002\u00e1\u0007\u00e1\u0002"+ - "\u00e2\u0007\u00e2\u0002\u00e3\u0007\u00e3\u0002\u00e4\u0007\u00e4\u0002"+ - "\u00e5\u0007\u00e5\u0002\u00e6\u0007\u00e6\u0002\u00e7\u0007\u00e7\u0002"+ - "\u00e8\u0007\u00e8\u0002\u00e9\u0007\u00e9\u0002\u00ea\u0007\u00ea\u0002"+ - "\u00eb\u0007\u00eb\u0002\u00ec\u0007\u00ec\u0002\u00ed\u0007\u00ed\u0001"+ - "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001"+ - "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0001"+ - "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ - "\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ - "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b"+ - "\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ - "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ - "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ - "\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ - "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ - "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ - "\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ - "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ - "\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+ - "\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+ - "\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001"+ - "\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ - "\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ - "\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001"+ - "\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001"+ - "\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ - "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ - "\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001"+ - "\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001"+ - "\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001"+ - "\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001"+ - "\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001"+ - "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001"+ - "\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001"+ - "\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001"+ - "\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001"+ - "\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001"+ - "\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001"+ - "\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001"+ - " \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ - " \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ - " \u0001 \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001!\u0001"+ - "!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001"+ - "!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001"+ - "\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001"+ - "\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001"+ - "\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001"+ - "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ - "#\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001"+ - "$\u0001$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001"+ - "%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001"+ - "&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'"+ - "\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001"+ - "(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001"+ - ")\u0001)\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001"+ - "*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001"+ - "+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u00010\u0001"+ - "0\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u00010\u0001"+ - "0\u00010\u00010\u00010\u00010\u00010\u00011\u00011\u00011\u00011\u0001"+ - "1\u00011\u00011\u00011\u00011\u00011\u00011\u00011\u00012\u00012\u0001"+ - "2\u00012\u00012\u00012\u00012\u00012\u00012\u00012\u00012\u00013\u0001"+ - "3\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u0001"+ - "3\u00013\u00013\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u0001"+ - "4\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u0001"+ - "5\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u0001"+ - "5\u00015\u00015\u00015\u00015\u00015\u00015\u00016\u00016\u00016\u0001"+ - "6\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u00016\u0001"+ - "7\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u0001"+ - "7\u00017\u00017\u00017\u00017\u00017\u00017\u00017\u00018\u00018\u0001"+ - "8\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u0001"+ - "8\u00018\u00018\u00019\u00019\u00019\u00019\u00019\u00019\u00019\u0001"+ - "9\u00019\u00019\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0001"+ - ":\u0001:\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001"+ - ";\u0001;\u0001;\u0001;\u0001;\u0001<\u0001<\u0001<\u0001<\u0001<\u0001"+ - "=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001"+ - "=\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001"+ - ">\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001"+ - "?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001"+ - "?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001"+ - "@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001"+ - "A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001"+ - "A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001"+ - "B\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001"+ - "E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001"+ - "F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001"+ - "F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001F\u0001G\u0001"+ - "G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001"+ - "G\u0001G\u0001G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001"+ - "H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001"+ - "I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001"+ - "J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001"+ - "J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001K\u0003"+ - "K\u05b1\bK\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0001L\u0003"+ - "L\u05bb\bL\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001"+ - "N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0001O\u0001O\u0001P\u0001"+ - "P\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ - "Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ - "S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+ - "S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001"+ - "T\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+ - "U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001V\u0001"+ - "V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ - "V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001"+ - "W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001X\u0001"+ - "X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+ - "X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ - "Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001[\u0001"+ - "[\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001]"+ - "\u0001]\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001"+ - "^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001"+ - "^\u0001^\u0001^\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001"+ - "_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001`\u0001"+ - "`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001"+ - "`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001`\u0001a\u0001"+ - "a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001"+ - "a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001"+ - "b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001b\u0001c\u0001"+ - "c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001c\u0001"+ - "c\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001d\u0001"+ - "d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001"+ - "d\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0001"+ - "e\u0001e\u0001e\u0001e\u0001f\u0001f\u0001f\u0001f\u0001f\u0001f\u0001"+ - "f\u0001f\u0001f\u0001f\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001"+ - "g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001"+ - "h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001h\u0001i\u0001i\u0001i\u0001"+ - "i\u0001i\u0001i\u0001i\u0001i\u0001i\u0001i\u0001i\u0001i\u0001i\u0001"+ - "j\u0001j\u0001j\u0001j\u0001j\u0001j\u0001j\u0001j\u0001j\u0001j\u0001"+ - "j\u0001j\u0001k\u0001k\u0001k\u0001k\u0001k\u0001k\u0001l\u0001l\u0001"+ - "l\u0001l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0001"+ - "m\u0001m\u0001n\u0001n\u0001n\u0001n\u0001n\u0001n\u0001n\u0001n\u0001"+ - "n\u0001o\u0001o\u0001o\u0001o\u0001o\u0001o\u0001o\u0001p\u0001p\u0001"+ - "p\u0001p\u0001p\u0001p\u0001p\u0001p\u0001p\u0001p\u0001p\u0001p\u0001"+ - "q\u0001q\u0001q\u0001q\u0001q\u0001q\u0001q\u0001q\u0001q\u0001q\u0001"+ - "q\u0001r\u0001r\u0001r\u0001r\u0001r\u0001r\u0001r\u0001r\u0001r\u0001"+ - "r\u0001r\u0001r\u0001r\u0001r\u0001s\u0001s\u0001s\u0001s\u0001s\u0001"+ - "s\u0001s\u0001s\u0001t\u0001t\u0001t\u0001t\u0001t\u0001t\u0001t\u0001"+ - "u\u0001u\u0001u\u0001u\u0001u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001"+ - "v\u0001v\u0001v\u0001v\u0001v\u0001v\u0001v\u0001w\u0001w\u0001w\u0001"+ - "w\u0001w\u0001w\u0001w\u0001w\u0001w\u0001w\u0001w\u0001w\u0001w\u0001"+ - "w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001x\u0001x\u0001x\u0001x\u0001"+ - "x\u0001x\u0001x\u0001x\u0001x\u0001x\u0001x\u0001x\u0001x\u0001x\u0001"+ - "y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001y\u0001z\u0001z\u0001z\u0001"+ - "z\u0001z\u0001z\u0001z\u0001z\u0001z\u0001z\u0001z\u0001z\u0001z\u0001"+ - "{\u0001{\u0001{\u0001{\u0001{\u0001{\u0001{\u0001{\u0001{\u0001{\u0001"+ - "{\u0001|\u0001|\u0001|\u0001|\u0001|\u0001|\u0001|\u0001|\u0001|\u0001"+ - "|\u0001|\u0001|\u0001}\u0001}\u0001}\u0001}\u0001}\u0001}\u0001}\u0001"+ - "~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001~\u0001\u007f\u0001\u007f"+ - "\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u007f"+ - "\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u007f"+ - "\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u007f"+ - "\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080"+ - "\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080"+ - "\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080"+ - "\u0001\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083"+ - "\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0086\u0001\u0086"+ - "\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0089\u0001\u0089"+ - "\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001\u008c\u0001\u008c"+ - "\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008e\u0001\u008e"+ - "\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u0090\u0001\u0090\u0001\u0091"+ - "\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0093\u0001\u0093\u0001\u0094"+ - "\u0001\u0094\u0001\u0095\u0001\u0095\u0001\u0096\u0001\u0096\u0001\u0097"+ - "\u0001\u0097\u0001\u0097\u0001\u0098\u0001\u0098\u0001\u0099\u0001\u0099"+ - "\u0001\u0099\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001\u009c"+ - "\u0001\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0003\u009d\u0844\b\u009d"+ - "\u0001\u009e\u0001\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0003\u009f"+ - "\u084b\b\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0003\u00a0"+ - "\u0851\b\u00a0\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a3"+ - "\u0001\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a6"+ - "\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a8"+ - "\u0003\u00a8\u0864\b\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00aa"+ - "\u0004\u00aa\u086a\b\u00aa\u000b\u00aa\f\u00aa\u086b\u0001\u00aa\u0001"+ - "\u00aa\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0005\u00ab\u0874"+ - "\b\u00ab\n\u00ab\f\u00ab\u0877\t\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ac"+ - "\u0001\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0003\u00ad\u0880\b\u00ad"+ - "\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0004\u00af"+ - "\u0887\b\u00af\u000b\u00af\f\u00af\u0888\u0001\u00af\u0001\u00af\u0001"+ - "\u00af\u0001\u00af\u0001\u00af\u0001\u00af\u0003\u00af\u0891\b\u00af\u0001"+ - "\u00af\u0001\u00af\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0003"+ - "\u00b0\u0899\b\u00b0\u0001\u00b1\u0004\u00b1\u089c\b\u00b1\u000b\u00b1"+ - "\f\u00b1\u089d\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b2"+ - "\u0001\u00b2\u0003\u00b2\u08a6\b\u00b2\u0003\u00b2\u08a8\b\u00b2\u0001"+ - "\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001"+ - "\u00b3\u0005\u00b3\u08b1\b\u00b3\n\u00b3\f\u00b3\u08b4\t\u00b3\u0001\u00b3"+ - "\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0005\u00b4"+ - "\u08bc\b\u00b4\n\u00b4\f\u00b4\u08bf\t\u00b4\u0001\u00b4\u0003\u00b4\u08c2"+ - "\b\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001"+ - "\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001"+ - "\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7\u0001"+ - "\u00b7\u0004\u00b7\u08d6\b\u00b7\u000b\u00b7\f\u00b7\u08d7\u0001\u00b7"+ - "\u0003\u00b7\u08db\b\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b8"+ - "\u0004\u00b8\u08e1\b\u00b8\u000b\u00b8\f\u00b8\u08e2\u0001\u00b8\u0003"+ - "\u00b8\u08e6\b\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001\u00ba\u0003"+ - "\u00ba\u08ec\b\u00ba\u0001\u00ba\u0001\u00ba\u0003\u00ba\u08f0\b\u00ba"+ - "\u0001\u00ba\u0001\u00ba\u0003\u00ba\u08f4\b\u00ba\u0001\u00ba\u0001\u00ba"+ - "\u0003\u00ba\u08f8\b\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bc\u0001\u00bc"+ - "\u0001\u00bc\u0003\u00bc\u08ff\b\u00bc\u0001\u00bd\u0001\u00bd\u0003\u00bd"+ - "\u0903\b\u00bd\u0001\u00bd\u0005\u00bd\u0906\b\u00bd\n\u00bd\f\u00bd\u0909"+ - "\t\u00bd\u0001\u00be\u0001\u00be\u0004\u00be\u090d\b\u00be\u000b\u00be"+ - "\f\u00be\u090e\u0001\u00be\u0003\u00be\u0912\b\u00be\u0001\u00bf\u0001"+ - "\u00bf\u0003\u00bf\u0916\b\u00bf\u0001\u00bf\u0004\u00bf\u0919\b\u00bf"+ - "\u000b\u00bf\f\u00bf\u091a\u0001\u00c0\u0004\u00c0\u091e\b\u00c0\u000b"+ - "\u00c0\f\u00c0\u091f\u0001\u00c0\u0001\u00c0\u0005\u00c0\u0924\b\u00c0"+ - "\n\u00c0\f\u00c0\u0927\t\u00c0\u0003\u00c0\u0929\b\u00c0\u0001\u00c0\u0003"+ - "\u00c0\u092c\b\u00c0\u0001\u00c0\u0001\u00c0\u0004\u00c0\u0930\b\u00c0"+ - "\u000b\u00c0\f\u00c0\u0931\u0001\u00c0\u0003\u00c0\u0935\b\u00c0\u0003"+ - "\u00c0\u0937\b\u00c0\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c2\u0001"+ - "\u00c2\u0001\u00c2\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c4\u0001"+ - "\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c5\u0001"+ - "\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c6\u0001"+ - "\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c6\u0001"+ - "\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001"+ - "\u00c7\u0001\u00c7\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001"+ - "\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001"+ - "\u00c8\u0001\u00c8\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001"+ - "\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001"+ - "\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001"+ - "\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001"+ - "\u00c9\u0001\u00c9\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001"+ - "\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001"+ - "\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001"+ - "\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001"+ - "\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001"+ - "\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cc\u0001"+ - "\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001"+ - "\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001"+ - "\u00cc\u0001\u00cc\u0001\u00cd\u0001\u00cd\u0001\u00cd\u0001\u00cd\u0001"+ - "\u00cd\u0001\u00cd\u0001\u00cd\u0001\u00cd\u0001\u00cd\u0001\u00cd\u0001"+ - "\u00cd\u0001\u00cd\u0001\u00cd\u0001\u00cd\u0001\u00cd\u0001\u00cd\u0001"+ - "\u00cd\u0001\u00cd\u0001\u00cd\u0001\u00cd\u0001\u00cd\u0001\u00cd\u0001"+ - "\u00cd\u0001\u00cd\u0001\u00cd\u0001\u00cd\u0001\u00cd\u0001\u00ce\u0001"+ - "\u00ce\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001"+ - "\u00cf\u0001\u00d0\u0001\u00d0\u0001\u00d0\u0001\u00d0\u0001\u00d0\u0001"+ - "\u00d1\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001\u00d2\u0001"+ - "\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d3\u0001"+ - "\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001"+ - "\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001"+ - "\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001"+ - "\u00d4\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001"+ - "\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d7\u0001"+ - "\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d8\u0001"+ - "\u00d8\u0001\u00d8\u0001\u00d8\u0001\u00d9\u0001\u00d9\u0001\u00d9\u0001"+ - "\u00d9\u0001\u00d9\u0001\u00d9\u0001\u00da\u0001\u00da\u0001\u00da\u0001"+ - "\u00da\u0001\u00da\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001"+ - "\u00db\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001"+ - "\u00dc\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00de\u0001"+ - "\u00de\u0001\u00de\u0001\u00de\u0001\u00de\u0001\u00de\u0001\u00de\u0001"+ - "\u00df\u0001\u00df\u0001\u00df\u0001\u00df\u0001\u00df\u0001\u00e0\u0001"+ - "\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e1\u0001\u00e1\u0001"+ - "\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e2\u0001\u00e2\u0001"+ - "\u00e2\u0001\u00e2\u0001\u00e3\u0001\u00e3\u0001\u00e3\u0001\u00e3\u0001"+ - "\u00e3\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001"+ - "\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e6\u0001\u00e6\u0001"+ - "\u00e6\u0001\u00e6\u0001\u00e6\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001"+ - "\u00e7\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0003\u00e8\u0a5b\b\u00e8\u0001"+ - "\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001"+ - "\u00e9\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0003\u00ea\u0a67\b\u00ea\u0001"+ - "\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00eb\u0001\u00eb\u0001\u00eb\u0001"+ - "\u00eb\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0003\u00ec\u0a73\b\u00ec\u0001"+ - "\u00ec\u0001\u00ec\u0001\u00ec\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001"+ - "\u00ed\u0000\u0000\u00ee\n\u0002\f\u0003\u000e\u0004\u0010\u0005\u0012"+ - "\u0006\u0014\u0007\u0016\b\u0018\t\u001a\n\u001c\u000b\u001e\f \r\"\u000e"+ - "$\u000f&\u0010(\u0011*\u0012,\u0013.\u00140\u00152\u00164\u00176\u0018"+ - "8\u0019:\u001a<\u001b>\u001c@\u001dB\u001eD\u001fF H!J\"L#N$P%R&T\'V("+ - "X)Z*\\+^,`-b.d/f0h1j2l3n4p5r6t7v8x9z:|;~<\u0080=\u0082>\u0084?\u0086@"+ - "\u0088A\u008aB\u008cC\u008eD\u0090E\u0092F\u0094G\u0096H\u0098I\u009a"+ - "J\u009cK\u009eL\u00a0M\u00a2N\u00a4O\u00a6P\u00a8Q\u00aaR\u00acS\u00ae"+ - "T\u00b0U\u00b2V\u00b4W\u00b6X\u00b8Y\u00baZ\u00bc[\u00be\\\u00c0]\u00c2"+ - "^\u00c4_\u00c6`\u00c8a\u00cab\u00ccc\u00ced\u00d0e\u00d2f\u00d4g\u00d6"+ - "h\u00d8i\u00daj\u00dck\u00del\u00e0m\u00e2n\u00e4o\u00e6p\u00e8q\u00ea"+ - "r\u00ecs\u00eet\u00f0u\u00f2v\u00f4w\u00f6x\u00f8y\u00faz\u00fc{\u00fe"+ - "|\u0100}\u0102~\u0104\u007f\u0106\u0080\u0108\u0081\u010a\u0082\u010c"+ - "\u0083\u010e\u0084\u0110\u0085\u0112\u0086\u0114\u0087\u0116\u0088\u0118"+ - "\u0089\u011a\u0000\u011c\u008a\u011e\u008b\u0120\u008c\u0122\u008d\u0124"+ - "\u008e\u0126\u008f\u0128\u0090\u012a\u0091\u012c\u0092\u012e\u0093\u0130"+ - "\u0094\u0132\u0095\u0134\u0096\u0136\u0097\u0138\u0098\u013a\u0099\u013c"+ - "\u009a\u013e\u009b\u0140\u009c\u0142\u009d\u0144\u009e\u0146\u009f\u0148"+ - "\u00a0\u014a\u00a1\u014c\u00a2\u014e\u00a3\u0150\u00a4\u0152\u00a5\u0154"+ - "\u00a6\u0156\u00a7\u0158\u00a8\u015a\u00a9\u015c\u00aa\u015e\u00ab\u0160"+ - "\u00ac\u0162\u00ad\u0164\u00ae\u0166\u00af\u0168\u0000\u016a\u00b0\u016c"+ - "\u00b1\u016e\u00b2\u0170\u00b3\u0172\u00b4\u0174\u00be\u0176\u00bf\u0178"+ - "\u00b5\u017a\u00b6\u017c\u0000\u017e\u0000\u0180\u0000\u0182\u0000\u0184"+ - "\u00b7\u0186\u00b8\u0188\u0000\u018a\u0000\u018c\u00b9\u018e\u00ba\u0190"+ - "\u00bb\u0192\u00c0\u0194\u00c1\u0196\u00c2\u0198\u00c3\u019a\u00c4\u019c"+ - "\u00c5\u019e\u00c6\u01a0\u00c7\u01a2\u00c8\u01a4\u00c9\u01a6\u00bc\u01a8"+ - "\u00ca\u01aa\u00cb\u01ac\u00cc\u01ae\u0000\u01b0\u0000\u01b2\u00cd\u01b4"+ - "\u0000\u01b6\u0000\u01b8\u0000\u01ba\u0000\u01bc\u00ce\u01be\u0000\u01c0"+ - "\u0000\u01c2\u0000\u01c4\u0000\u01c6\u00cf\u01c8\u0000\u01ca\u0000\u01cc"+ - "\u0000\u01ce\u0000\u01d0\u0000\u01d2\u0000\u01d4\u0000\u01d6\u0000\u01d8"+ - "\u0000\u01da\u0000\u01dc\u0000\u01de\u00bd\u01e0\u0000\u01e2\u0000\u01e4"+ - "\u0000\n\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\u0017\u0002"+ - "\u0000||\u2228\u2228\u0002\u0000&&\u2227\u2227\u0002\u0000!!\u00ac\u00ac"+ - "\u0004\u0000\t\n\r\r \u00a0\u00a0\u0002\u0000\"\"\\\\\u0003\u0000 &("+ - "[]~\b\u0000\"\"\'\'\\\\bbffnnrrtt\u0003\u0000\n\n\"\"\\\\\u0002\u0000"+ - "\n\n\u8000\uffff\u8000\uffff\u0002\u0001\n\n\u8000\uffff\u8000\uffff\u0002"+ - "\u000001__\u0002\u0000LLll\u0003\u0000AF__af\u0002\u0000AFaf\u0002\u0000"+ - "AZaz\u0002\u0000#$__\u0002\u0000EEee\u0002\u0000++--\u0002\u0000FFff\u0002"+ - "\u0000DDdd\u0002\u0000RRrr\u0001\u0000\\\\\u0001\u0000**\u0a9a\u0000\n"+ - "\u0001\u0000\u0000\u0000\u0000\f\u0001\u0000\u0000\u0000\u0000\u000e\u0001"+ - "\u0000\u0000\u0000\u0000\u0010\u0001\u0000\u0000\u0000\u0000\u0012\u0001"+ - "\u0000\u0000\u0000\u0000\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001"+ - "\u0000\u0000\u0000\u0000\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001"+ - "\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001"+ - "\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000"+ - "\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000"+ - "\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,"+ - "\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000"+ - "\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000"+ - "\u00006\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:"+ - "\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000"+ - "\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000"+ - "\u0000D\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H"+ - "\u0001\u0000\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000"+ - "\u0000\u0000\u0000N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000"+ - "\u0000R\u0001\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V"+ - "\u0001\u0000\u0000\u0000\u0000X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000"+ - "\u0000\u0000\u0000\\\u0001\u0000\u0000\u0000\u0000^\u0001\u0000\u0000"+ - "\u0000\u0000`\u0001\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000\u0000"+ - "d\u0001\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001"+ - "\u0000\u0000\u0000\u0000j\u0001\u0000\u0000\u0000\u0000l\u0001\u0000\u0000"+ - "\u0000\u0000n\u0001\u0000\u0000\u0000\u0000p\u0001\u0000\u0000\u0000\u0000"+ - "r\u0001\u0000\u0000\u0000\u0000t\u0001\u0000\u0000\u0000\u0000v\u0001"+ - "\u0000\u0000\u0000\u0000x\u0001\u0000\u0000\u0000\u0000z\u0001\u0000\u0000"+ - "\u0000\u0000|\u0001\u0000\u0000\u0000\u0000~\u0001\u0000\u0000\u0000\u0000"+ - "\u0080\u0001\u0000\u0000\u0000\u0000\u0082\u0001\u0000\u0000\u0000\u0000"+ - "\u0084\u0001\u0000\u0000\u0000\u0000\u0086\u0001\u0000\u0000\u0000\u0000"+ - "\u0088\u0001\u0000\u0000\u0000\u0000\u008a\u0001\u0000\u0000\u0000\u0000"+ - "\u008c\u0001\u0000\u0000\u0000\u0000\u008e\u0001\u0000\u0000\u0000\u0000"+ - "\u0090\u0001\u0000\u0000\u0000\u0000\u0092\u0001\u0000\u0000\u0000\u0000"+ - "\u0094\u0001\u0000\u0000\u0000\u0000\u0096\u0001\u0000\u0000\u0000\u0000"+ - "\u0098\u0001\u0000\u0000\u0000\u0000\u009a\u0001\u0000\u0000\u0000\u0000"+ - "\u009c\u0001\u0000\u0000\u0000\u0000\u009e\u0001\u0000\u0000\u0000\u0000"+ - "\u00a0\u0001\u0000\u0000\u0000\u0000\u00a2\u0001\u0000\u0000\u0000\u0000"+ - "\u00a4\u0001\u0000\u0000\u0000\u0000\u00a6\u0001\u0000\u0000\u0000\u0000"+ - "\u00a8\u0001\u0000\u0000\u0000\u0000\u00aa\u0001\u0000\u0000\u0000\u0000"+ - "\u00ac\u0001\u0000\u0000\u0000\u0000\u00ae\u0001\u0000\u0000\u0000\u0000"+ - "\u00b0\u0001\u0000\u0000\u0000\u0000\u00b2\u0001\u0000\u0000\u0000\u0000"+ - "\u00b4\u0001\u0000\u0000\u0000\u0000\u00b6\u0001\u0000\u0000\u0000\u0000"+ - "\u00b8\u0001\u0000\u0000\u0000\u0000\u00ba\u0001\u0000\u0000\u0000\u0000"+ - "\u00bc\u0001\u0000\u0000\u0000\u0000\u00be\u0001\u0000\u0000\u0000\u0000"+ - "\u00c0\u0001\u0000\u0000\u0000\u0000\u00c2\u0001\u0000\u0000\u0000\u0000"+ - "\u00c4\u0001\u0000\u0000\u0000\u0000\u00c6\u0001\u0000\u0000\u0000\u0000"+ - "\u00c8\u0001\u0000\u0000\u0000\u0000\u00ca\u0001\u0000\u0000\u0000\u0000"+ - "\u00cc\u0001\u0000\u0000\u0000\u0000\u00ce\u0001\u0000\u0000\u0000\u0000"+ - "\u00d0\u0001\u0000\u0000\u0000\u0000\u00d2\u0001\u0000\u0000\u0000\u0000"+ - "\u00d4\u0001\u0000\u0000\u0000\u0000\u00d6\u0001\u0000\u0000\u0000\u0000"+ - "\u00d8\u0001\u0000\u0000\u0000\u0000\u00da\u0001\u0000\u0000\u0000\u0000"+ - "\u00dc\u0001\u0000\u0000\u0000\u0000\u00de\u0001\u0000\u0000\u0000\u0000"+ - "\u00e0\u0001\u0000\u0000\u0000\u0000\u00e2\u0001\u0000\u0000\u0000\u0000"+ - "\u00e4\u0001\u0000\u0000\u0000\u0000\u00e6\u0001\u0000\u0000\u0000\u0000"+ - "\u00e8\u0001\u0000\u0000\u0000\u0000\u00ea\u0001\u0000\u0000\u0000\u0000"+ - "\u00ec\u0001\u0000\u0000\u0000\u0000\u00ee\u0001\u0000\u0000\u0000\u0000"+ - "\u00f0\u0001\u0000\u0000\u0000\u0000\u00f2\u0001\u0000\u0000\u0000\u0000"+ - "\u00f4\u0001\u0000\u0000\u0000\u0000\u00f6\u0001\u0000\u0000\u0000\u0000"+ - "\u00f8\u0001\u0000\u0000\u0000\u0000\u00fa\u0001\u0000\u0000\u0000\u0000"+ - "\u00fc\u0001\u0000\u0000\u0000\u0000\u00fe\u0001\u0000\u0000\u0000\u0000"+ - "\u0100\u0001\u0000\u0000\u0000\u0000\u0102\u0001\u0000\u0000\u0000\u0000"+ - "\u0104\u0001\u0000\u0000\u0000\u0000\u0106\u0001\u0000\u0000\u0000\u0000"+ - "\u0108\u0001\u0000\u0000\u0000\u0000\u010a\u0001\u0000\u0000\u0000\u0000"+ - "\u010c\u0001\u0000\u0000\u0000\u0000\u010e\u0001\u0000\u0000\u0000\u0000"+ - "\u0110\u0001\u0000\u0000\u0000\u0000\u0112\u0001\u0000\u0000\u0000\u0000"+ - "\u0114\u0001\u0000\u0000\u0000\u0000\u0116\u0001\u0000\u0000\u0000\u0000"+ - "\u0118\u0001\u0000\u0000\u0000\u0000\u011c\u0001\u0000\u0000\u0000\u0000"+ - "\u011e\u0001\u0000\u0000\u0000\u0000\u0120\u0001\u0000\u0000\u0000\u0000"+ - "\u0122\u0001\u0000\u0000\u0000\u0000\u0124\u0001\u0000\u0000\u0000\u0000"+ - "\u0126\u0001\u0000\u0000\u0000\u0000\u0128\u0001\u0000\u0000\u0000\u0000"+ - "\u012a\u0001\u0000\u0000\u0000\u0000\u012c\u0001\u0000\u0000\u0000\u0000"+ - "\u012e\u0001\u0000\u0000\u0000\u0000\u0130\u0001\u0000\u0000\u0000\u0000"+ - "\u0132\u0001\u0000\u0000\u0000\u0000\u0134\u0001\u0000\u0000\u0000\u0000"+ - "\u0136\u0001\u0000\u0000\u0000\u0000\u0138\u0001\u0000\u0000\u0000\u0000"+ - "\u013a\u0001\u0000\u0000\u0000\u0000\u013c\u0001\u0000\u0000\u0000\u0000"+ - "\u013e\u0001\u0000\u0000\u0000\u0000\u0140\u0001\u0000\u0000\u0000\u0000"+ - "\u0142\u0001\u0000\u0000\u0000\u0000\u0144\u0001\u0000\u0000\u0000\u0000"+ - "\u0146\u0001\u0000\u0000\u0000\u0000\u0148\u0001\u0000\u0000\u0000\u0000"+ - "\u014a\u0001\u0000\u0000\u0000\u0000\u014c\u0001\u0000\u0000\u0000\u0000"+ - "\u014e\u0001\u0000\u0000\u0000\u0000\u0150\u0001\u0000\u0000\u0000\u0000"+ - "\u0152\u0001\u0000\u0000\u0000\u0000\u0154\u0001\u0000\u0000\u0000\u0000"+ - "\u0156\u0001\u0000\u0000\u0000\u0000\u0158\u0001\u0000\u0000\u0000\u0000"+ - "\u015a\u0001\u0000\u0000\u0000\u0000\u015c\u0001\u0000\u0000\u0000\u0000"+ - "\u015e\u0001\u0000\u0000\u0000\u0000\u0160\u0001\u0000\u0000\u0000\u0000"+ - "\u0162\u0001\u0000\u0000\u0000\u0000\u0164\u0001\u0000\u0000\u0000\u0000"+ - "\u0166\u0001\u0000\u0000\u0000\u0000\u0168\u0001\u0000\u0000\u0000\u0000"+ - "\u016a\u0001\u0000\u0000\u0000\u0000\u016c\u0001\u0000\u0000\u0000\u0000"+ - "\u016e\u0001\u0000\u0000\u0000\u0000\u0170\u0001\u0000\u0000\u0000\u0000"+ - "\u0172\u0001\u0000\u0000\u0000\u0000\u0174\u0001\u0000\u0000\u0000\u0000"+ - "\u0176\u0001\u0000\u0000\u0000\u0000\u0178\u0001\u0000\u0000\u0000\u0000"+ - "\u017a\u0001\u0000\u0000\u0000\u0000\u0184\u0001\u0000\u0000\u0000\u0000"+ - "\u0186\u0001\u0000\u0000\u0000\u0000\u018c\u0001\u0000\u0000\u0000\u0000"+ - "\u018e\u0001\u0000\u0000\u0000\u0000\u0190\u0001\u0000\u0000\u0000\u0000"+ - "\u0192\u0001\u0000\u0000\u0000\u0000\u0194\u0001\u0000\u0000\u0000\u0000"+ - "\u0196\u0001\u0000\u0000\u0000\u0000\u0198\u0001\u0000\u0000\u0000\u0000"+ - "\u019a\u0001\u0000\u0000\u0000\u0000\u019c\u0001\u0000\u0000\u0000\u0000"+ - "\u019e\u0001\u0000\u0000\u0000\u0000\u01a0\u0001\u0000\u0000\u0000\u0000"+ - "\u01a2\u0001\u0000\u0000\u0000\u0000\u01a4\u0001\u0000\u0000\u0000\u0000"+ - "\u01a6\u0001\u0000\u0000\u0000\u0001\u01a8\u0001\u0000\u0000\u0000\u0001"+ - "\u01aa\u0001\u0000\u0000\u0000\u0001\u01ac\u0001\u0000\u0000\u0000\u0001"+ - "\u01ae\u0001\u0000\u0000\u0000\u0001\u01b0\u0001\u0000\u0000\u0000\u0002"+ - "\u01b2\u0001\u0000\u0000\u0000\u0002\u01b4\u0001\u0000\u0000\u0000\u0002"+ - "\u01b6\u0001\u0000\u0000\u0000\u0002\u01b8\u0001\u0000\u0000\u0000\u0002"+ - "\u01ba\u0001\u0000\u0000\u0000\u0003\u01bc\u0001\u0000\u0000\u0000\u0003"+ - "\u01be\u0001\u0000\u0000\u0000\u0003\u01c0\u0001\u0000\u0000\u0000\u0003"+ - "\u01c2\u0001\u0000\u0000\u0000\u0003\u01c4\u0001\u0000\u0000\u0000\u0004"+ - "\u01c6\u0001\u0000\u0000\u0000\u0004\u01c8\u0001\u0000\u0000\u0000\u0004"+ - "\u01ca\u0001\u0000\u0000\u0000\u0004\u01cc\u0001\u0000\u0000\u0000\u0004"+ - "\u01ce\u0001\u0000\u0000\u0000\u0005\u01d0\u0001\u0000\u0000\u0000\u0005"+ - "\u01d2\u0001\u0000\u0000\u0000\u0005\u01d4\u0001\u0000\u0000\u0000\u0006"+ - "\u01d6\u0001\u0000\u0000\u0000\u0006\u01d8\u0001\u0000\u0000\u0000\u0007"+ - "\u01da\u0001\u0000\u0000\u0000\u0007\u01dc\u0001\u0000\u0000\u0000\b\u01de"+ - "\u0001\u0000\u0000\u0000\b\u01e0\u0001\u0000\u0000\u0000\t\u01e2\u0001"+ - "\u0000\u0000\u0000\t\u01e4\u0001\u0000\u0000\u0000\n\u01e6\u0001\u0000"+ - "\u0000\u0000\f\u01ed\u0001\u0000\u0000\u0000\u000e\u01f6\u0001\u0000\u0000"+ - "\u0000\u0010\u01fd\u0001\u0000\u0000\u0000\u0012\u0206\u0001\u0000\u0000"+ - "\u0000\u0014\u020d\u0001\u0000\u0000\u0000\u0016\u0217\u0001\u0000\u0000"+ - "\u0000\u0018\u0228\u0001\u0000\u0000\u0000\u001a\u0233\u0001\u0000\u0000"+ - "\u0000\u001c\u0242\u0001\u0000\u0000\u0000\u001e\u024b\u0001\u0000\u0000"+ - "\u0000 \u0254\u0001\u0000\u0000\u0000\"\u025a\u0001\u0000\u0000\u0000"+ - "$\u0262\u0001\u0000\u0000\u0000&\u026d\u0001\u0000\u0000\u0000(\u0277"+ - "\u0001\u0000\u0000\u0000*\u0283\u0001\u0000\u0000\u0000,\u0292\u0001\u0000"+ - "\u0000\u0000.\u029d\u0001\u0000\u0000\u00000\u02a7\u0001\u0000\u0000\u0000"+ - "2\u02b9\u0001\u0000\u0000\u00004\u02c6\u0001\u0000\u0000\u00006\u02d3"+ - "\u0001\u0000\u0000\u00008\u02e1\u0001\u0000\u0000\u0000:\u02ef\u0001\u0000"+ - "\u0000\u0000<\u0301\u0001\u0000\u0000\u0000>\u030d\u0001\u0000\u0000\u0000"+ - "@\u0318\u0001\u0000\u0000\u0000B\u0326\u0001\u0000\u0000\u0000D\u032f"+ - "\u0001\u0000\u0000\u0000F\u0343\u0001\u0000\u0000\u0000H\u0350\u0001\u0000"+ - "\u0000\u0000J\u0364\u0001\u0000\u0000\u0000L\u0380\u0001\u0000\u0000\u0000"+ - "N\u0396\u0001\u0000\u0000\u0000P\u03b0\u0001\u0000\u0000\u0000R\u03be"+ - "\u0001\u0000\u0000\u0000T\u03cb\u0001\u0000\u0000\u0000V\u03d4\u0001\u0000"+ - "\u0000\u0000X\u03df\u0001\u0000\u0000\u0000Z\u03e6\u0001\u0000\u0000\u0000"+ - "\\\u03f0\u0001\u0000\u0000\u0000^\u03fa\u0001\u0000\u0000\u0000`\u040a"+ - "\u0001\u0000\u0000\u0000b\u0413\u0001\u0000\u0000\u0000d\u0422\u0001\u0000"+ - "\u0000\u0000f\u042e\u0001\u0000\u0000\u0000h\u043a\u0001\u0000\u0000\u0000"+ - "j\u0447\u0001\u0000\u0000\u0000l\u0458\u0001\u0000\u0000\u0000n\u0464"+ - "\u0001\u0000\u0000\u0000p\u046f\u0001\u0000\u0000\u0000r\u047d\u0001\u0000"+ - "\u0000\u0000t\u048e\u0001\u0000\u0000\u0000v\u049f\u0001\u0000\u0000\u0000"+ - "x\u04ac\u0001\u0000\u0000\u0000z\u04be\u0001\u0000\u0000\u0000|\u04cd"+ - "\u0001\u0000\u0000\u0000~\u04db\u0001\u0000\u0000\u0000\u0080\u04e0\u0001"+ - "\u0000\u0000\u0000\u0082\u04ed\u0001\u0000\u0000\u0000\u0084\u04f2\u0001"+ - "\u0000\u0000\u0000\u0086\u04fd\u0001\u0000\u0000\u0000\u0088\u050d\u0001"+ - "\u0000\u0000\u0000\u008a\u0520\u0001\u0000\u0000\u0000\u008c\u052a\u0001"+ - "\u0000\u0000\u0000\u008e\u053e\u0001\u0000\u0000\u0000\u0090\u0543\u0001"+ - "\u0000\u0000\u0000\u0092\u054e\u0001\u0000\u0000\u0000\u0094\u0554\u0001"+ - "\u0000\u0000\u0000\u0096\u055c\u0001\u0000\u0000\u0000\u0098\u0573\u0001"+ - "\u0000\u0000\u0000\u009a\u0584\u0001\u0000\u0000\u0000\u009c\u058c\u0001"+ - "\u0000\u0000\u0000\u009e\u0594\u0001\u0000\u0000\u0000\u00a0\u05b0\u0001"+ - "\u0000\u0000\u0000\u00a2\u05ba\u0001\u0000\u0000\u0000\u00a4\u05bc\u0001"+ - "\u0000\u0000\u0000\u00a6\u05c3\u0001\u0000\u0000\u0000\u00a8\u05c7\u0001"+ - "\u0000\u0000\u0000\u00aa\u05cd\u0001\u0000\u0000\u0000\u00ac\u05d3\u0001"+ - "\u0000\u0000\u0000\u00ae\u05d9\u0001\u0000\u0000\u0000\u00b0\u05e2\u0001"+ - "\u0000\u0000\u0000\u00b2\u05ef\u0001\u0000\u0000\u0000\u00b4\u05fa\u0001"+ - "\u0000\u0000\u0000\u00b6\u0609\u0001\u0000\u0000\u0000\u00b8\u061b\u0001"+ - "\u0000\u0000\u0000\u00ba\u0627\u0001\u0000\u0000\u0000\u00bc\u0634\u0001"+ - "\u0000\u0000\u0000\u00be\u0641\u0001\u0000\u0000\u0000\u00c0\u064b\u0001"+ - "\u0000\u0000\u0000\u00c2\u0654\u0001\u0000\u0000\u0000\u00c4\u0659\u0001"+ - "\u0000\u0000\u0000\u00c6\u065f\u0001\u0000\u0000\u0000\u00c8\u0670\u0001"+ - "\u0000\u0000\u0000\u00ca\u0680\u0001\u0000\u0000\u0000\u00cc\u0694\u0001"+ - "\u0000\u0000\u0000\u00ce\u06a7\u0001\u0000\u0000\u0000\u00d0\u06b2\u0001"+ - "\u0000\u0000\u0000\u00d2\u06c2\u0001\u0000\u0000\u0000\u00d4\u06d2\u0001"+ - "\u0000\u0000\u0000\u00d6\u06df\u0001\u0000\u0000\u0000\u00d8\u06e9\u0001"+ - "\u0000\u0000\u0000\u00da\u06f6\u0001\u0000\u0000\u0000\u00dc\u0700\u0001"+ - "\u0000\u0000\u0000\u00de\u070d\u0001\u0000\u0000\u0000\u00e0\u0719\u0001"+ - "\u0000\u0000\u0000\u00e2\u071f\u0001\u0000\u0000\u0000\u00e4\u0724\u0001"+ - "\u0000\u0000\u0000\u00e6\u072d\u0001\u0000\u0000\u0000\u00e8\u0736\u0001"+ - "\u0000\u0000\u0000\u00ea\u073d\u0001\u0000\u0000\u0000\u00ec\u0749\u0001"+ - "\u0000\u0000\u0000\u00ee\u0754\u0001\u0000\u0000\u0000\u00f0\u0762\u0001"+ - "\u0000\u0000\u0000\u00f2\u076a\u0001\u0000\u0000\u0000\u00f4\u0771\u0001"+ - "\u0000\u0000\u0000\u00f6\u0779\u0001\u0000\u0000\u0000\u00f8\u0782\u0001"+ - "\u0000\u0000\u0000\u00fa\u0792\u0001\u0000\u0000\u0000\u00fc\u07a3\u0001"+ - "\u0000\u0000\u0000\u00fe\u07aa\u0001\u0000\u0000\u0000\u0100\u07b7\u0001"+ - "\u0000\u0000\u0000\u0102\u07c2\u0001\u0000\u0000\u0000\u0104\u07ce\u0001"+ - "\u0000\u0000\u0000\u0106\u07d5\u0001\u0000\u0000\u0000\u0108\u07dd\u0001"+ - "\u0000\u0000\u0000\u010a\u07f4\u0001\u0000\u0000\u0000\u010c\u0803\u0001"+ - "\u0000\u0000\u0000\u010e\u0805\u0001\u0000\u0000\u0000\u0110\u0807\u0001"+ - "\u0000\u0000\u0000\u0112\u0809\u0001\u0000\u0000\u0000\u0114\u080b\u0001"+ - "\u0000\u0000\u0000\u0116\u080d\u0001\u0000\u0000\u0000\u0118\u080f\u0001"+ - "\u0000\u0000\u0000\u011a\u0811\u0001\u0000\u0000\u0000\u011c\u0813\u0001"+ - "\u0000\u0000\u0000\u011e\u0815\u0001\u0000\u0000\u0000\u0120\u0817\u0001"+ - "\u0000\u0000\u0000\u0122\u0819\u0001\u0000\u0000\u0000\u0124\u081c\u0001"+ - "\u0000\u0000\u0000\u0126\u081f\u0001\u0000\u0000\u0000\u0128\u0821\u0001"+ - "\u0000\u0000\u0000\u012a\u0824\u0001\u0000\u0000\u0000\u012c\u0826\u0001"+ - "\u0000\u0000\u0000\u012e\u0828\u0001\u0000\u0000\u0000\u0130\u082a\u0001"+ - "\u0000\u0000\u0000\u0132\u082c\u0001\u0000\u0000\u0000\u0134\u082e\u0001"+ - "\u0000\u0000\u0000\u0136\u0830\u0001\u0000\u0000\u0000\u0138\u0832\u0001"+ - "\u0000\u0000\u0000\u013a\u0835\u0001\u0000\u0000\u0000\u013c\u0837\u0001"+ - "\u0000\u0000\u0000\u013e\u083a\u0001\u0000\u0000\u0000\u0140\u083c\u0001"+ - "\u0000\u0000\u0000\u0142\u083e\u0001\u0000\u0000\u0000\u0144\u0843\u0001"+ - "\u0000\u0000\u0000\u0146\u0845\u0001\u0000\u0000\u0000\u0148\u084a\u0001"+ - "\u0000\u0000\u0000\u014a\u0850\u0001\u0000\u0000\u0000\u014c\u0852\u0001"+ - "\u0000\u0000\u0000\u014e\u0854\u0001\u0000\u0000\u0000\u0150\u0856\u0001"+ - "\u0000\u0000\u0000\u0152\u0858\u0001\u0000\u0000\u0000\u0154\u085a\u0001"+ - "\u0000\u0000\u0000\u0156\u085c\u0001\u0000\u0000\u0000\u0158\u085e\u0001"+ - "\u0000\u0000\u0000\u015a\u0863\u0001\u0000\u0000\u0000\u015c\u0865\u0001"+ - "\u0000\u0000\u0000\u015e\u0869\u0001\u0000\u0000\u0000\u0160\u086f\u0001"+ - "\u0000\u0000\u0000\u0162\u087a\u0001\u0000\u0000\u0000\u0164\u087f\u0001"+ - "\u0000\u0000\u0000\u0166\u0881\u0001\u0000\u0000\u0000\u0168\u0884\u0001"+ - "\u0000\u0000\u0000\u016a\u0898\u0001\u0000\u0000\u0000\u016c\u089b\u0001"+ - "\u0000\u0000\u0000\u016e\u089f\u0001\u0000\u0000\u0000\u0170\u08ab\u0001"+ - "\u0000\u0000\u0000\u0172\u08b7\u0001\u0000\u0000\u0000\u0174\u08c5\u0001"+ - "\u0000\u0000\u0000\u0176\u08cc\u0001\u0000\u0000\u0000\u0178\u08d2\u0001"+ - "\u0000\u0000\u0000\u017a\u08dc\u0001\u0000\u0000\u0000\u017c\u08e7\u0001"+ - "\u0000\u0000\u0000\u017e\u08eb\u0001\u0000\u0000\u0000\u0180\u08f9\u0001"+ - "\u0000\u0000\u0000\u0182\u08fe\u0001\u0000\u0000\u0000\u0184\u0902\u0001"+ - "\u0000\u0000\u0000\u0186\u090c\u0001\u0000\u0000\u0000\u0188\u0913\u0001"+ - "\u0000\u0000\u0000\u018a\u0936\u0001\u0000\u0000\u0000\u018c\u0938\u0001"+ - "\u0000\u0000\u0000\u018e\u093b\u0001\u0000\u0000\u0000\u0190\u093e\u0001"+ - "\u0000\u0000\u0000\u0192\u0941\u0001\u0000\u0000\u0000\u0194\u0947\u0001"+ - "\u0000\u0000\u0000\u0196\u094d\u0001\u0000\u0000\u0000\u0198\u0954\u0001"+ - "\u0000\u0000\u0000\u019a\u095c\u0001\u0000\u0000\u0000\u019c\u0968\u0001"+ - "\u0000\u0000\u0000\u019e\u0980\u0001\u0000\u0000\u0000\u01a0\u098d\u0001"+ - "\u0000\u0000\u0000\u01a2\u09a1\u0001\u0000\u0000\u0000\u01a4\u09b0\u0001"+ - "\u0000\u0000\u0000\u01a6\u09cb\u0001\u0000\u0000\u0000\u01a8\u09cd\u0001"+ - "\u0000\u0000\u0000\u01aa\u09d3\u0001\u0000\u0000\u0000\u01ac\u09d8\u0001"+ - "\u0000\u0000\u0000\u01ae\u09dd\u0001\u0000\u0000\u0000\u01b0\u09e3\u0001"+ - "\u0000\u0000\u0000\u01b2\u09e7\u0001\u0000\u0000\u0000\u01b4\u09f7\u0001"+ - "\u0000\u0000\u0000\u01b6\u09fc\u0001\u0000\u0000\u0000\u01b8\u0a01\u0001"+ - "\u0000\u0000\u0000\u01ba\u0a07\u0001\u0000\u0000\u0000\u01bc\u0a0b\u0001"+ - "\u0000\u0000\u0000\u01be\u0a11\u0001\u0000\u0000\u0000\u01c0\u0a16\u0001"+ - "\u0000\u0000\u0000\u01c2\u0a1b\u0001\u0000\u0000\u0000\u01c4\u0a21\u0001"+ - "\u0000\u0000\u0000\u01c6\u0a25\u0001\u0000\u0000\u0000\u01c8\u0a2c\u0001"+ - "\u0000\u0000\u0000\u01ca\u0a31\u0001\u0000\u0000\u0000\u01cc\u0a36\u0001"+ - "\u0000\u0000\u0000\u01ce\u0a3c\u0001\u0000\u0000\u0000\u01d0\u0a40\u0001"+ - "\u0000\u0000\u0000\u01d2\u0a45\u0001\u0000\u0000\u0000\u01d4\u0a4a\u0001"+ - "\u0000\u0000\u0000\u01d6\u0a4e\u0001\u0000\u0000\u0000\u01d8\u0a53\u0001"+ - "\u0000\u0000\u0000\u01da\u0a5a\u0001\u0000\u0000\u0000\u01dc\u0a5f\u0001"+ - "\u0000\u0000\u0000\u01de\u0a66\u0001\u0000\u0000\u0000\u01e0\u0a6b\u0001"+ - "\u0000\u0000\u0000\u01e2\u0a72\u0001\u0000\u0000\u0000\u01e4\u0a77\u0001"+ - "\u0000\u0000\u0000\u01e6\u01e7\u0005\\\u0000\u0000\u01e7\u01e8\u0005s"+ - "\u0000\u0000\u01e8\u01e9\u0005o\u0000\u0000\u01e9\u01ea\u0005r\u0000\u0000"+ - "\u01ea\u01eb\u0005t\u0000\u0000\u01eb\u01ec\u0005s\u0000\u0000\u01ec\u000b"+ - "\u0001\u0000\u0000\u0000\u01ed\u01ee\u0005\\\u0000\u0000\u01ee\u01ef\u0005"+ - "g\u0000\u0000\u01ef\u01f0\u0005e\u0000\u0000\u01f0\u01f1\u0005n\u0000"+ - "\u0000\u01f1\u01f2\u0005e\u0000\u0000\u01f2\u01f3\u0005r\u0000\u0000\u01f3"+ - "\u01f4\u0005i\u0000\u0000\u01f4\u01f5\u0005c\u0000\u0000\u01f5\r\u0001"+ - "\u0000\u0000\u0000\u01f6\u01f7\u0005\\\u0000\u0000\u01f7\u01f8\u0005p"+ - "\u0000\u0000\u01f8\u01f9\u0005r\u0000\u0000\u01f9\u01fa\u0005o\u0000\u0000"+ - "\u01fa\u01fb\u0005x\u0000\u0000\u01fb\u01fc\u0005y\u0000\u0000\u01fc\u000f"+ - "\u0001\u0000\u0000\u0000\u01fd\u01fe\u0005\\\u0000\u0000\u01fe\u01ff\u0005"+ - "e\u0000\u0000\u01ff\u0200\u0005x\u0000\u0000\u0200\u0201\u0005t\u0000"+ - "\u0000\u0201\u0202\u0005e\u0000\u0000\u0202\u0203\u0005n\u0000\u0000\u0203"+ - "\u0204\u0005d\u0000\u0000\u0204\u0205\u0005s\u0000\u0000\u0205\u0011\u0001"+ - "\u0000\u0000\u0000\u0206\u0207\u0005\\\u0000\u0000\u0207\u0208\u0005o"+ - "\u0000\u0000\u0208\u0209\u0005n\u0000\u0000\u0209\u020a\u0005e\u0000\u0000"+ - "\u020a\u020b\u0005o\u0000\u0000\u020b\u020c\u0005f\u0000\u0000\u020c\u0013"+ - "\u0001\u0000\u0000\u0000\u020d\u020e\u0005\\\u0000\u0000\u020e\u020f\u0005"+ - "a\u0000\u0000\u020f\u0210\u0005b\u0000\u0000\u0210\u0211\u0005s\u0000"+ - "\u0000\u0211\u0212\u0005t\u0000\u0000\u0212\u0213\u0005r\u0000\u0000\u0213"+ - "\u0214\u0005a\u0000\u0000\u0214\u0215\u0005c\u0000\u0000\u0215\u0216\u0005"+ - "t\u0000\u0000\u0216\u0015\u0001\u0000\u0000\u0000\u0217\u0218\u0005\\"+ - "\u0000\u0000\u0218\u0219\u0005s\u0000\u0000\u0219\u021a\u0005c\u0000\u0000"+ - "\u021a\u021b\u0005h\u0000\u0000\u021b\u021c\u0005e\u0000\u0000\u021c\u021d"+ - "\u0005m\u0000\u0000\u021d\u021e\u0005a\u0000\u0000\u021e\u021f\u0005V"+ - "\u0000\u0000\u021f\u0220\u0005a\u0000\u0000\u0220\u0221\u0005r\u0000\u0000"+ - "\u0221\u0222\u0005i\u0000\u0000\u0222\u0223\u0005a\u0000\u0000\u0223\u0224"+ - "\u0005b\u0000\u0000\u0224\u0225\u0005l\u0000\u0000\u0225\u0226\u0005e"+ - "\u0000\u0000\u0226\u0227\u0005s\u0000\u0000\u0227\u0017\u0001\u0000\u0000"+ - "\u0000\u0228\u0229\u0005\\\u0000\u0000\u0229\u022a\u0005s\u0000\u0000"+ - "\u022a\u022b\u0005c\u0000\u0000\u022b\u022c\u0005h\u0000\u0000\u022c\u022d"+ - "\u0005e\u0000\u0000\u022d\u022e\u0005m\u0000\u0000\u022e\u022f\u0005a"+ - "\u0000\u0000\u022f\u0230\u0005V\u0000\u0000\u0230\u0231\u0005a\u0000\u0000"+ - "\u0231\u0232\u0005r\u0000\u0000\u0232\u0019\u0001\u0000\u0000\u0000\u0233"+ - "\u0234\u0005\\\u0000\u0000\u0234\u0235\u0005m\u0000\u0000\u0235\u0236"+ - "\u0005o\u0000\u0000\u0236\u0237\u0005d\u0000\u0000\u0237\u0238\u0005a"+ - "\u0000\u0000\u0238\u0239\u0005l\u0000\u0000\u0239\u023a\u0005O\u0000\u0000"+ - "\u023a\u023b\u0005p\u0000\u0000\u023b\u023c\u0005e\u0000\u0000\u023c\u023d"+ - "\u0005r\u0000\u0000\u023d\u023e\u0005a\u0000\u0000\u023e\u023f\u0005t"+ - "\u0000\u0000\u023f\u0240\u0005o\u0000\u0000\u0240\u0241\u0005r\u0000\u0000"+ - "\u0241\u001b\u0001\u0000\u0000\u0000\u0242\u0243\u0005\\\u0000\u0000\u0243"+ - "\u0244\u0005p\u0000\u0000\u0244\u0245\u0005r\u0000\u0000\u0245\u0246\u0005"+ - "o\u0000\u0000\u0246\u0247\u0005g\u0000\u0000\u0247\u0248\u0005r\u0000"+ - "\u0000\u0248\u0249\u0005a\u0000\u0000\u0249\u024a\u0005m\u0000\u0000\u024a"+ - "\u001d\u0001\u0000\u0000\u0000\u024b\u024c\u0005\\\u0000\u0000\u024c\u024d"+ - "\u0005f\u0000\u0000\u024d\u024e\u0005o\u0000\u0000\u024e\u024f\u0005r"+ - "\u0000\u0000\u024f\u0250\u0005m\u0000\u0000\u0250\u0251\u0005u\u0000\u0000"+ - "\u0251\u0252\u0005l\u0000\u0000\u0252\u0253\u0005a\u0000\u0000\u0253\u001f"+ - "\u0001\u0000\u0000\u0000\u0254\u0255\u0005\\\u0000\u0000\u0255\u0256\u0005"+ - "t\u0000\u0000\u0256\u0257\u0005e\u0000\u0000\u0257\u0258\u0005r\u0000"+ - "\u0000\u0258\u0259\u0005m\u0000\u0000\u0259!\u0001\u0000\u0000\u0000\u025a"+ - "\u025b\u0005\\\u0000\u0000\u025b\u025c\u0005u\u0000\u0000\u025c\u025d"+ - "\u0005p\u0000\u0000\u025d\u025e\u0005d\u0000\u0000\u025e\u025f\u0005a"+ - "\u0000\u0000\u025f\u0260\u0005t\u0000\u0000\u0260\u0261\u0005e\u0000\u0000"+ - "\u0261#\u0001\u0000\u0000\u0000\u0262\u0263\u0005\\\u0000\u0000\u0263"+ - "\u0264\u0005v\u0000\u0000\u0264\u0265\u0005a\u0000\u0000\u0265\u0266\u0005"+ - "r\u0000\u0000\u0266\u0267\u0005i\u0000\u0000\u0267\u0268\u0005a\u0000"+ - "\u0000\u0268\u0269\u0005b\u0000\u0000\u0269\u026a\u0005l\u0000\u0000\u026a"+ - "\u026b\u0005e\u0000\u0000\u026b\u026c\u0005s\u0000\u0000\u026c%\u0001"+ - "\u0000\u0000\u0000\u026d\u026e\u0005\\\u0000\u0000\u026e\u026f\u0005v"+ - "\u0000\u0000\u026f\u0270\u0005a\u0000\u0000\u0270\u0271\u0005r\u0000\u0000"+ - "\u0271\u0272\u0005i\u0000\u0000\u0272\u0273\u0005a\u0000\u0000\u0273\u0274"+ - "\u0005b\u0000\u0000\u0274\u0275\u0005l\u0000\u0000\u0275\u0276\u0005e"+ - "\u0000\u0000\u0276\'\u0001\u0000\u0000\u0000\u0277\u0278\u0005\\\u0000"+ - "\u0000\u0278\u0279\u0005s\u0000\u0000\u0279\u027a\u0005k\u0000\u0000\u027a"+ - "\u027b\u0005o\u0000\u0000\u027b\u027c\u0005l\u0000\u0000\u027c\u027d\u0005"+ - "e\u0000\u0000\u027d\u027e\u0005m\u0000\u0000\u027e\u027f\u0005T\u0000"+ - "\u0000\u027f\u0280\u0005e\u0000\u0000\u0280\u0281\u0005r\u0000\u0000\u0281"+ - "\u0282\u0005m\u0000\u0000\u0282)\u0001\u0000\u0000\u0000\u0283\u0284\u0005"+ - "\\\u0000\u0000\u0284\u0285\u0005s\u0000\u0000\u0285\u0286\u0005k\u0000"+ - "\u0000\u0286\u0287\u0005o\u0000\u0000\u0287\u0288\u0005l\u0000\u0000\u0288"+ - "\u0289\u0005e\u0000\u0000\u0289\u028a\u0005m\u0000\u0000\u028a\u028b\u0005"+ - "F\u0000\u0000\u028b\u028c\u0005o\u0000\u0000\u028c\u028d\u0005r\u0000"+ - "\u0000\u028d\u028e\u0005m\u0000\u0000\u028e\u028f\u0005u\u0000\u0000\u028f"+ - "\u0290\u0005l\u0000\u0000\u0290\u0291\u0005a\u0000\u0000\u0291+\u0001"+ - "\u0000\u0000\u0000\u0292\u0293\u0005\\\u0000\u0000\u0293\u0294\u0005t"+ - "\u0000\u0000\u0294\u0295\u0005e\u0000\u0000\u0295\u0296\u0005r\u0000\u0000"+ - "\u0296\u0297\u0005m\u0000\u0000\u0297\u0298\u0005l\u0000\u0000\u0298\u0299"+ - "\u0005a\u0000\u0000\u0299\u029a\u0005b\u0000\u0000\u029a\u029b\u0005e"+ - "\u0000\u0000\u029b\u029c\u0005l\u0000\u0000\u029c-\u0001\u0000\u0000\u0000"+ - "\u029d\u029e\u0005\\\u0000\u0000\u029e\u029f\u0005m\u0000\u0000\u029f"+ - "\u02a0\u0005o\u0000\u0000\u02a0\u02a1\u0005d\u0000\u0000\u02a1\u02a2\u0005"+ - "i\u0000\u0000\u02a2\u02a3\u0005f\u0000\u0000\u02a3\u02a4\u0005i\u0000"+ - "\u0000\u02a4\u02a5\u0005e\u0000\u0000\u02a5\u02a6\u0005s\u0000\u0000\u02a6"+ - "/\u0001\u0000\u0000\u0000\u02a7\u02a8\u0005\\\u0000\u0000\u02a8\u02a9"+ - "\u0005p\u0000\u0000\u02a9\u02aa\u0005r\u0000\u0000\u02aa\u02ab\u0005o"+ - "\u0000\u0000\u02ab\u02ac\u0005g\u0000\u0000\u02ac\u02ad\u0005r\u0000\u0000"+ - "\u02ad\u02ae\u0005a\u0000\u0000\u02ae\u02af\u0005m\u0000\u0000\u02af\u02b0"+ - "\u0005V\u0000\u0000\u02b0\u02b1\u0005a\u0000\u0000\u02b1\u02b2\u0005r"+ - "\u0000\u0000\u02b2\u02b3\u0005i\u0000\u0000\u02b3\u02b4\u0005a\u0000\u0000"+ - "\u02b4\u02b5\u0005b\u0000\u0000\u02b5\u02b6\u0005l\u0000\u0000\u02b6\u02b7"+ - "\u0005e\u0000\u0000\u02b7\u02b8\u0005s\u0000\u0000\u02b81\u0001\u0000"+ - "\u0000\u0000\u02b9\u02ba\u0005\\\u0000\u0000\u02ba\u02bb\u0005s\u0000"+ - "\u0000\u02bb\u02bc\u0005t\u0000\u0000\u02bc\u02bd\u0005o\u0000\u0000\u02bd"+ - "\u02be\u0005r\u0000\u0000\u02be\u02bf\u0005e\u0000\u0000\u02bf\u02c0\u0005"+ - "T\u0000\u0000\u02c0\u02c1\u0005e\u0000\u0000\u02c1\u02c2\u0005r\u0000"+ - "\u0000\u02c2\u02c3\u0005m\u0000\u0000\u02c3\u02c4\u0005I\u0000\u0000\u02c4"+ - "\u02c5\u0005n\u0000\u0000\u02c53\u0001\u0000\u0000\u0000\u02c6\u02c7\u0005"+ - "\\\u0000\u0000\u02c7\u02c8\u0005s\u0000\u0000\u02c8\u02c9\u0005t\u0000"+ - "\u0000\u02c9\u02ca\u0005o\u0000\u0000\u02ca\u02cb\u0005r\u0000\u0000\u02cb"+ - "\u02cc\u0005e\u0000\u0000\u02cc\u02cd\u0005S\u0000\u0000\u02cd\u02ce\u0005"+ - "t\u0000\u0000\u02ce\u02cf\u0005m\u0000\u0000\u02cf\u02d0\u0005t\u0000"+ - "\u0000\u02d0\u02d1\u0005I\u0000\u0000\u02d1\u02d2\u0005n\u0000\u0000\u02d2"+ - "5\u0001\u0000\u0000\u0000\u02d3\u02d4\u0005\\\u0000\u0000\u02d4\u02d5"+ - "\u0005h\u0000\u0000\u02d5\u02d6\u0005a\u0000\u0000\u02d6\u02d7\u0005s"+ - "\u0000\u0000\u02d7\u02d8\u0005I\u0000\u0000\u02d8\u02d9\u0005n\u0000\u0000"+ - "\u02d9\u02da\u0005v\u0000\u0000\u02da\u02db\u0005a\u0000\u0000\u02db\u02dc"+ - "\u0005r\u0000\u0000\u02dc\u02dd\u0005i\u0000\u0000\u02dd\u02de\u0005a"+ - "\u0000\u0000\u02de\u02df\u0005n\u0000\u0000\u02df\u02e0\u0005t\u0000\u0000"+ - "\u02e07\u0001\u0000\u0000\u0000\u02e1\u02e2\u0005\\\u0000\u0000\u02e2"+ - "\u02e3\u0005g\u0000\u0000\u02e3\u02e4\u0005e\u0000\u0000\u02e4\u02e5\u0005"+ - "t\u0000\u0000\u02e5\u02e6\u0005I\u0000\u0000\u02e6\u02e7\u0005n\u0000"+ - "\u0000\u02e7\u02e8\u0005v\u0000\u0000\u02e8\u02e9\u0005a\u0000\u0000\u02e9"+ - "\u02ea\u0005r\u0000\u0000\u02ea\u02eb\u0005i\u0000\u0000\u02eb\u02ec\u0005"+ - "a\u0000\u0000\u02ec\u02ed\u0005n\u0000\u0000\u02ed\u02ee\u0005t\u0000"+ - "\u0000\u02ee9\u0001\u0000\u0000\u0000\u02ef\u02f0\u0005\\\u0000\u0000"+ - "\u02f0\u02f1\u0005g\u0000\u0000\u02f1\u02f2\u0005e\u0000\u0000\u02f2\u02f3"+ - "\u0005t\u0000\u0000\u02f3\u02f4\u0005F\u0000\u0000\u02f4\u02f5\u0005r"+ - "\u0000\u0000\u02f5\u02f6\u0005e\u0000\u0000\u02f6\u02f7\u0005e\u0000\u0000"+ - "\u02f7\u02f8\u0005I\u0000\u0000\u02f8\u02f9\u0005n\u0000\u0000\u02f9\u02fa"+ - "\u0005v\u0000\u0000\u02fa\u02fb\u0005a\u0000\u0000\u02fb\u02fc\u0005r"+ - "\u0000\u0000\u02fc\u02fd\u0005i\u0000\u0000\u02fd\u02fe\u0005a\u0000\u0000"+ - "\u02fe\u02ff\u0005n\u0000\u0000\u02ff\u0300\u0005t\u0000\u0000\u0300;"+ - "\u0001\u0000\u0000\u0000\u0301\u0302\u0005\\\u0000\u0000\u0302\u0303\u0005"+ - "g\u0000\u0000\u0303\u0304\u0005e\u0000\u0000\u0304\u0305\u0005t\u0000"+ - "\u0000\u0305\u0306\u0005V\u0000\u0000\u0306\u0307\u0005a\u0000\u0000\u0307"+ - "\u0308\u0005r\u0000\u0000\u0308\u0309\u0005i\u0000\u0000\u0309\u030a\u0005"+ - "a\u0000\u0000\u030a\u030b\u0005n\u0000\u0000\u030b\u030c\u0005t\u0000"+ - "\u0000\u030c=\u0001\u0000\u0000\u0000\u030d\u030e\u0005\\\u0000\u0000"+ - "\u030e\u030f\u0005i\u0000\u0000\u030f\u0310\u0005s\u0000\u0000\u0310\u0311"+ - "\u0005L\u0000\u0000\u0311\u0312\u0005a\u0000\u0000\u0312\u0313\u0005b"+ - "\u0000\u0000\u0313\u0314\u0005e\u0000\u0000\u0314\u0315\u0005l\u0000\u0000"+ - "\u0315\u0316\u0005e\u0000\u0000\u0316\u0317\u0005d\u0000\u0000\u0317?"+ - "\u0001\u0000\u0000\u0000\u0318\u0319\u0005\\\u0000\u0000\u0319\u031a\u0005"+ - "s\u0000\u0000\u031a\u031b\u0005a\u0000\u0000\u031b\u031c\u0005m\u0000"+ - "\u0000\u031c\u031d\u0005e\u0000\u0000\u031d\u031e\u0005O\u0000\u0000\u031e"+ - "\u031f\u0005b\u0000\u0000\u031f\u0320\u0005s\u0000\u0000\u0320\u0321\u0005"+ - "e\u0000\u0000\u0321\u0322\u0005r\u0000\u0000\u0322\u0323\u0005v\u0000"+ - "\u0000\u0323\u0324\u0005e\u0000\u0000\u0324\u0325\u0005r\u0000\u0000\u0325"+ - "A\u0001\u0000\u0000\u0000\u0326\u0327\u0005\\\u0000\u0000\u0327\u0328"+ - "\u0005v\u0000\u0000\u0328\u0329\u0005a\u0000\u0000\u0329\u032a\u0005r"+ - "\u0000\u0000\u032a\u032b\u0005c\u0000\u0000\u032b\u032c\u0005o\u0000\u0000"+ - "\u032c\u032d\u0005n\u0000\u0000\u032d\u032e\u0005d\u0000\u0000\u032eC"+ - "\u0001\u0000\u0000\u0000\u032f\u0330\u0005\\\u0000\u0000\u0330\u0331\u0005"+ - "a\u0000\u0000\u0331\u0332\u0005p\u0000\u0000\u0332\u0333\u0005p\u0000"+ - "\u0000\u0333\u0334\u0005l\u0000\u0000\u0334\u0335\u0005y\u0000\u0000\u0335"+ - "\u0336\u0005U\u0000\u0000\u0336\u0337\u0005p\u0000\u0000\u0337\u0338\u0005"+ - "d\u0000\u0000\u0338\u0339\u0005a\u0000\u0000\u0339\u033a\u0005t\u0000"+ - "\u0000\u033a\u033b\u0005e\u0000\u0000\u033b\u033c\u0005O\u0000\u0000\u033c"+ - "\u033d\u0005n\u0000\u0000\u033d\u033e\u0005R\u0000\u0000\u033e\u033f\u0005"+ - "i\u0000\u0000\u033f\u0340\u0005g\u0000\u0000\u0340\u0341\u0005i\u0000"+ - "\u0000\u0341\u0342\u0005d\u0000\u0000\u0342E\u0001\u0000\u0000\u0000\u0343"+ - "\u0344\u0005\\\u0000\u0000\u0344\u0345\u0005d\u0000\u0000\u0345\u0346"+ - "\u0005e\u0000\u0000\u0346\u0347\u0005p\u0000\u0000\u0347\u0348\u0005e"+ - "\u0000\u0000\u0348\u0349\u0005n\u0000\u0000\u0349\u034a\u0005d\u0000\u0000"+ - "\u034a\u034b\u0005i\u0000\u0000\u034b\u034c\u0005n\u0000\u0000\u034c\u034d"+ - "\u0005g\u0000\u0000\u034d\u034e\u0005O\u0000\u0000\u034e\u034f\u0005n"+ - "\u0000\u0000\u034fG\u0001\u0000\u0000\u0000\u0350\u0351\u0005\\\u0000"+ - "\u0000\u0351\u0352\u0005d\u0000\u0000\u0352\u0353\u0005i\u0000\u0000\u0353"+ - "\u0354\u0005s\u0000\u0000\u0354\u0355\u0005j\u0000\u0000\u0355\u0356\u0005"+ - "o\u0000\u0000\u0356\u0357\u0005i\u0000\u0000\u0357\u0358\u0005n\u0000"+ - "\u0000\u0358\u0359\u0005t\u0000\u0000\u0359\u035a\u0005M\u0000\u0000\u035a"+ - "\u035b\u0005o\u0000\u0000\u035b\u035c\u0005d\u0000\u0000\u035c\u035d\u0005"+ - "u\u0000\u0000\u035d\u035e\u0005l\u0000\u0000\u035e\u035f\u0005o\u0000"+ - "\u0000\u035f\u0360\u0005N\u0000\u0000\u0360\u0361\u0005u\u0000\u0000\u0361"+ - "\u0362\u0005l\u0000\u0000\u0362\u0363\u0005l\u0000\u0000\u0363I\u0001"+ - "\u0000\u0000\u0000\u0364\u0365\u0005\\\u0000\u0000\u0365\u0366\u0005d"+ - "\u0000\u0000\u0366\u0367\u0005r\u0000\u0000\u0367\u0368\u0005o\u0000\u0000"+ - "\u0368\u0369\u0005p\u0000\u0000\u0369\u036a\u0005E\u0000\u0000\u036a\u036b"+ - "\u0005f\u0000\u0000\u036b\u036c\u0005f\u0000\u0000\u036c\u036d\u0005e"+ - "\u0000\u0000\u036d\u036e\u0005c\u0000\u0000\u036e\u036f\u0005t\u0000\u0000"+ - "\u036f\u0370\u0005l\u0000\u0000\u0370\u0371\u0005e\u0000\u0000\u0371\u0372"+ - "\u0005s\u0000\u0000\u0372\u0373\u0005s\u0000\u0000\u0373\u0374\u0005E"+ - "\u0000\u0000\u0374\u0375\u0005l\u0000\u0000\u0375\u0376\u0005e\u0000\u0000"+ - "\u0376\u0377\u0005m\u0000\u0000\u0377\u0378\u0005e\u0000\u0000\u0378\u0379"+ - "\u0005n\u0000\u0000\u0379\u037a\u0005t\u0000\u0000\u037a\u037b\u0005a"+ - "\u0000\u0000\u037b\u037c\u0005r\u0000\u0000\u037c\u037d\u0005i\u0000\u0000"+ - "\u037d\u037e\u0005e\u0000\u0000\u037e\u037f\u0005s\u0000\u0000\u037fK"+ - "\u0001\u0000\u0000\u0000\u0380\u0381\u0005\\\u0000\u0000\u0381\u0382\u0005"+ - "d\u0000\u0000\u0382\u0383\u0005r\u0000\u0000\u0383\u0384\u0005o\u0000"+ - "\u0000\u0384\u0385\u0005p\u0000\u0000\u0385\u0386\u0005E\u0000\u0000\u0386"+ - "\u0387\u0005f\u0000\u0000\u0387\u0388\u0005f\u0000\u0000\u0388\u0389\u0005"+ - "e\u0000\u0000\u0389\u038a\u0005c\u0000\u0000\u038a\u038b\u0005t\u0000"+ - "\u0000\u038b\u038c\u0005l\u0000\u0000\u038c\u038d\u0005e\u0000\u0000\u038d"+ - "\u038e\u0005s\u0000\u0000\u038e\u038f\u0005s\u0000\u0000\u038f\u0390\u0005"+ - "S\u0000\u0000\u0390\u0391\u0005t\u0000\u0000\u0391\u0392\u0005o\u0000"+ - "\u0000\u0392\u0393\u0005r\u0000\u0000\u0393\u0394\u0005e\u0000\u0000\u0394"+ - "\u0395\u0005s\u0000\u0000\u0395M\u0001\u0000\u0000\u0000\u0396\u0397\u0005"+ - "\\\u0000\u0000\u0397\u0398\u0005s\u0000\u0000\u0398\u0399\u0005i\u0000"+ - "\u0000\u0399\u039a\u0005m\u0000\u0000\u039a\u039b\u0005p\u0000\u0000\u039b"+ - "\u039c\u0005l\u0000\u0000\u039c\u039d\u0005i\u0000\u0000\u039d\u039e\u0005"+ - "f\u0000\u0000\u039e\u039f\u0005y\u0000\u0000\u039f\u03a0\u0005I\u0000"+ - "\u0000\u03a0\u03a1\u0005f\u0000\u0000\u03a1\u03a2\u0005T\u0000\u0000\u03a2"+ - "\u03a3\u0005h\u0000\u0000\u03a3\u03a4\u0005e\u0000\u0000\u03a4\u03a5\u0005"+ - "n\u0000\u0000\u03a5\u03a6\u0005E\u0000\u0000\u03a6\u03a7\u0005l\u0000"+ - "\u0000\u03a7\u03a8\u0005s\u0000\u0000\u03a8\u03a9\u0005e\u0000\u0000\u03a9"+ - "\u03aa\u0005U\u0000\u0000\u03aa\u03ab\u0005p\u0000\u0000\u03ab\u03ac\u0005"+ - "d\u0000\u0000\u03ac\u03ad\u0005a\u0000\u0000\u03ad\u03ae\u0005t\u0000"+ - "\u0000\u03ae\u03af\u0005e\u0000\u0000\u03afO\u0001\u0000\u0000\u0000\u03b0"+ - "\u03b1\u0005\\\u0000\u0000\u03b1\u03b2\u0005e\u0000\u0000\u03b2\u03b3"+ - "\u0005n\u0000\u0000\u03b3\u03b4\u0005u\u0000\u0000\u03b4\u03b5\u0005m"+ - "\u0000\u0000\u03b5\u03b6\u0005C\u0000\u0000\u03b6\u03b7\u0005o\u0000\u0000"+ - "\u03b7\u03b8\u0005n\u0000\u0000\u03b8\u03b9\u0005s\u0000\u0000\u03b9\u03ba"+ - "\u0005t\u0000\u0000\u03ba\u03bb\u0005a\u0000\u0000\u03bb\u03bc\u0005n"+ - "\u0000\u0000\u03bc\u03bd\u0005t\u0000\u0000\u03bdQ\u0001\u0000\u0000\u0000"+ - "\u03be\u03bf\u0005\\\u0000\u0000\u03bf\u03c0\u0005f\u0000\u0000\u03c0"+ - "\u03c1\u0005r\u0000\u0000\u03c1\u03c2\u0005e\u0000\u0000\u03c2\u03c3\u0005"+ - "e\u0000\u0000\u03c3\u03c4\u0005L\u0000\u0000\u03c4\u03c5\u0005a\u0000"+ - "\u0000\u03c5\u03c6\u0005b\u0000\u0000\u03c6\u03c7\u0005e\u0000\u0000\u03c7"+ - "\u03c8\u0005l\u0000\u0000\u03c8\u03c9\u0005I\u0000\u0000\u03c9\u03ca\u0005"+ - "n\u0000\u0000\u03caS\u0001\u0000\u0000\u0000\u03cb\u03cc\u0005\\\u0000"+ - "\u0000\u03cc\u03cd\u0005h\u0000\u0000\u03cd\u03ce\u0005a\u0000\u0000\u03ce"+ - "\u03cf\u0005s\u0000\u0000\u03cf\u03d0\u0005S\u0000\u0000\u03d0\u03d1\u0005"+ - "o\u0000\u0000\u03d1\u03d2\u0005r\u0000\u0000\u03d2\u03d3\u0005t\u0000"+ - "\u0000\u03d3U\u0001\u0000\u0000\u0000\u03d4\u03d5\u0005\\\u0000\u0000"+ - "\u03d5\u03d6\u0005f\u0000\u0000\u03d6\u03d7\u0005i\u0000\u0000\u03d7\u03d8"+ - "\u0005e\u0000\u0000\u03d8\u03d9\u0005l\u0000\u0000\u03d9\u03da\u0005d"+ - "\u0000\u0000\u03da\u03db\u0005T\u0000\u0000\u03db\u03dc\u0005y\u0000\u0000"+ - "\u03dc\u03dd\u0005p\u0000\u0000\u03dd\u03de\u0005e\u0000\u0000\u03deW"+ - "\u0001\u0000\u0000\u0000\u03df\u03e0\u0005\\\u0000\u0000\u03e0\u03e1\u0005"+ - "f\u0000\u0000\u03e1\u03e2\u0005i\u0000\u0000\u03e2\u03e3\u0005n\u0000"+ - "\u0000\u03e3\u03e4\u0005a\u0000\u0000\u03e4\u03e5\u0005l\u0000\u0000\u03e5"+ - "Y\u0001\u0000\u0000\u0000\u03e6\u03e7\u0005\\\u0000\u0000\u03e7\u03e8"+ - "\u0005e\u0000\u0000\u03e8\u03e9\u0005l\u0000\u0000\u03e9\u03ea\u0005e"+ - "\u0000\u0000\u03ea\u03eb\u0005m\u0000\u0000\u03eb\u03ec\u0005S\u0000\u0000"+ - "\u03ec\u03ed\u0005o\u0000\u0000\u03ed\u03ee\u0005r\u0000\u0000\u03ee\u03ef"+ - "\u0005t\u0000\u0000\u03ef[\u0001\u0000\u0000\u0000\u03f0\u03f1\u0005\\"+ - "\u0000\u0000\u03f1\u03f2\u0005h\u0000\u0000\u03f2\u03f3\u0005a\u0000\u0000"+ - "\u03f3\u03f4\u0005s\u0000\u0000\u03f4\u03f5\u0005L\u0000\u0000\u03f5\u03f6"+ - "\u0005a\u0000\u0000\u03f6\u03f7\u0005b\u0000\u0000\u03f7\u03f8\u0005e"+ - "\u0000\u0000\u03f8\u03f9\u0005l\u0000\u0000\u03f9]\u0001\u0000\u0000\u0000"+ - "\u03fa\u03fb\u0005\\\u0000\u0000\u03fb\u03fc\u0005h\u0000\u0000\u03fc"+ - "\u03fd\u0005a\u0000\u0000\u03fd\u03fe\u0005s\u0000\u0000\u03fe\u03ff\u0005"+ - "S\u0000\u0000\u03ff\u0400\u0005u\u0000\u0000\u0400\u0401\u0005b\u0000"+ - "\u0000\u0401\u0402\u0005F\u0000\u0000\u0402\u0403\u0005o\u0000\u0000\u0403"+ - "\u0404\u0005r\u0000\u0000\u0404\u0405\u0005m\u0000\u0000\u0405\u0406\u0005"+ - "u\u0000\u0000\u0406\u0407\u0005l\u0000\u0000\u0407\u0408\u0005a\u0000"+ - "\u0000\u0408\u0409\u0005s\u0000\u0000\u0409_\u0001\u0000\u0000\u0000\u040a"+ - "\u040b\u0005\\\u0000\u0000\u040b\u040c\u0005i\u0000\u0000\u040c\u040d"+ - "\u0005s\u0000\u0000\u040d\u040e\u0005A\u0000\u0000\u040e\u040f\u0005r"+ - "\u0000\u0000\u040f\u0410\u0005r\u0000\u0000\u0410\u0411\u0005a\u0000\u0000"+ - "\u0411\u0412\u0005y\u0000\u0000\u0412a\u0001\u0000\u0000\u0000\u0413\u0414"+ - "\u0005\\\u0000\u0000\u0414\u0415\u0005i\u0000\u0000\u0415\u0416\u0005"+ - "s\u0000\u0000\u0416\u0417\u0005A\u0000\u0000\u0417\u0418\u0005r\u0000"+ - "\u0000\u0418\u0419\u0005r\u0000\u0000\u0419\u041a\u0005a\u0000\u0000\u041a"+ - "\u041b\u0005y\u0000\u0000\u041b\u041c\u0005L\u0000\u0000\u041c\u041d\u0005"+ - "e\u0000\u0000\u041d\u041e\u0005n\u0000\u0000\u041e\u041f\u0005g\u0000"+ - "\u0000\u041f\u0420\u0005t\u0000\u0000\u0420\u0421\u0005h\u0000\u0000\u0421"+ - "c\u0001\u0000\u0000\u0000\u0422\u0423\u0005\\\u0000\u0000\u0423\u0424"+ - "\u0005i\u0000\u0000\u0424\u0425\u0005s\u0000\u0000\u0425\u0426\u0005C"+ - "\u0000\u0000\u0426\u0427\u0005o\u0000\u0000\u0427\u0428\u0005n\u0000\u0000"+ - "\u0428\u0429\u0005s\u0000\u0000\u0429\u042a\u0005t\u0000\u0000\u042a\u042b"+ - "\u0005a\u0000\u0000\u042b\u042c\u0005n\u0000\u0000\u042c\u042d\u0005t"+ - "\u0000\u0000\u042de\u0001\u0000\u0000\u0000\u042e\u042f\u0005\\\u0000"+ - "\u0000\u042f\u0430\u0005i\u0000\u0000\u0430\u0431\u0005s\u0000\u0000\u0431"+ - "\u0432\u0005E\u0000\u0000\u0432\u0433\u0005n\u0000\u0000\u0433\u0434\u0005"+ - "u\u0000\u0000\u0434\u0435\u0005m\u0000\u0000\u0435\u0436\u0005T\u0000"+ - "\u0000\u0436\u0437\u0005y\u0000\u0000\u0437\u0438\u0005p\u0000\u0000\u0438"+ - "\u0439\u0005e\u0000\u0000\u0439g\u0001\u0000\u0000\u0000\u043a\u043b\u0005"+ - "\\\u0000\u0000\u043b\u043c\u0005i\u0000\u0000\u043c\u043d\u0005s\u0000"+ - "\u0000\u043d\u043e\u0005I\u0000\u0000\u043e\u043f\u0005n\u0000\u0000\u043f"+ - "\u0440\u0005d\u0000\u0000\u0440\u0441\u0005u\u0000\u0000\u0441\u0442\u0005"+ - "c\u0000\u0000\u0442\u0443\u0005t\u0000\u0000\u0443\u0444\u0005V\u0000"+ - "\u0000\u0444\u0445\u0005a\u0000\u0000\u0445\u0446\u0005r\u0000\u0000\u0446"+ - "i\u0001\u0000\u0000\u0000\u0447\u0448\u0005\\\u0000\u0000\u0448\u0449"+ - "\u0005i\u0000\u0000\u0449\u044a\u0005s\u0000\u0000\u044a\u044b\u0005L"+ - "\u0000\u0000\u044b\u044c\u0005o\u0000\u0000\u044c\u044d\u0005c\u0000\u0000"+ - "\u044d\u044e\u0005a\u0000\u0000\u044e\u044f\u0005l\u0000\u0000\u044f\u0450"+ - "\u0005V\u0000\u0000\u0450\u0451\u0005a\u0000\u0000\u0451\u0452\u0005r"+ - "\u0000\u0000\u0452\u0453\u0005i\u0000\u0000\u0453\u0454\u0005a\u0000\u0000"+ - "\u0454\u0455\u0005b\u0000\u0000\u0455\u0456\u0005l\u0000\u0000\u0456\u0457"+ - "\u0005e\u0000\u0000\u0457k\u0001\u0000\u0000\u0000\u0458\u0459\u0005\\"+ - "\u0000\u0000\u0459\u045a\u0005i\u0000\u0000\u045a\u045b\u0005s\u0000\u0000"+ - "\u045b\u045c\u0005O\u0000\u0000\u045c\u045d\u0005b\u0000\u0000\u045d\u045e"+ - "\u0005s\u0000\u0000\u045e\u045f\u0005e\u0000\u0000\u045f\u0460\u0005r"+ - "\u0000\u0000\u0460\u0461\u0005v\u0000\u0000\u0461\u0462\u0005e\u0000\u0000"+ - "\u0462\u0463\u0005r\u0000\u0000\u0463m\u0001\u0000\u0000\u0000\u0464\u0465"+ - "\u0005\\\u0000\u0000\u0465\u0466\u0005d\u0000\u0000\u0466\u0467\u0005"+ - "i\u0000\u0000\u0467\u0468\u0005f\u0000\u0000\u0468\u0469\u0005f\u0000"+ - "\u0000\u0469\u046a\u0005e\u0000\u0000\u046a\u046b\u0005r\u0000\u0000\u046b"+ - "\u046c\u0005e\u0000\u0000\u046c\u046d\u0005n\u0000\u0000\u046d\u046e\u0005"+ - "t\u0000\u0000\u046eo\u0001\u0000\u0000\u0000\u046f\u0470\u0005\\\u0000"+ - "\u0000\u0470\u0471\u0005m\u0000\u0000\u0471\u0472\u0005e\u0000\u0000\u0472"+ - "\u0473\u0005t\u0000\u0000\u0473\u0474\u0005a\u0000\u0000\u0474\u0475\u0005"+ - "D\u0000\u0000\u0475\u0476\u0005i\u0000\u0000\u0476\u0477\u0005s\u0000"+ - "\u0000\u0477\u0478\u0005j\u0000\u0000\u0478\u0479\u0005o\u0000\u0000\u0479"+ - "\u047a\u0005i\u0000\u0000\u047a\u047b\u0005n\u0000\u0000\u047b\u047c\u0005"+ - "t\u0000\u0000\u047cq\u0001\u0000\u0000\u0000\u047d\u047e\u0005\\\u0000"+ - "\u0000\u047e\u047f\u0005i\u0000\u0000\u047f\u0480\u0005s\u0000\u0000\u0480"+ - "\u0481\u0005T\u0000\u0000\u0481\u0482\u0005h\u0000\u0000\u0482\u0483\u0005"+ - "i\u0000\u0000\u0483\u0484\u0005s\u0000\u0000\u0484\u0485\u0005R\u0000"+ - "\u0000\u0485\u0486\u0005e\u0000\u0000\u0486\u0487\u0005f\u0000\u0000\u0487"+ - "\u0488\u0005e\u0000\u0000\u0488\u0489\u0005r\u0000\u0000\u0489\u048a\u0005"+ - "e\u0000\u0000\u048a\u048b\u0005n\u0000\u0000\u048b\u048c\u0005c\u0000"+ - "\u0000\u048c\u048d\u0005e\u0000\u0000\u048ds\u0001\u0000\u0000\u0000\u048e"+ - "\u048f\u0005\\\u0000\u0000\u048f\u0490\u0005d\u0000\u0000\u0490\u0491"+ - "\u0005i\u0000\u0000\u0491\u0492\u0005f\u0000\u0000\u0492\u0493\u0005f"+ - "\u0000\u0000\u0493\u0494\u0005e\u0000\u0000\u0494\u0495\u0005r\u0000\u0000"+ - "\u0495\u0496\u0005e\u0000\u0000\u0496\u0497\u0005n\u0000\u0000\u0497\u0498"+ - "\u0005t\u0000\u0000\u0498\u0499\u0005F\u0000\u0000\u0499\u049a\u0005i"+ - "\u0000\u0000\u049a\u049b\u0005e\u0000\u0000\u049b\u049c\u0005l\u0000\u0000"+ - "\u049c\u049d\u0005d\u0000\u0000\u049d\u049e\u0005s\u0000\u0000\u049eu"+ - "\u0001\u0000\u0000\u0000\u049f\u04a0\u0005\\\u0000\u0000\u04a0\u04a1\u0005"+ - "i\u0000\u0000\u04a1\u04a2\u0005s\u0000\u0000\u04a2\u04a3\u0005R\u0000"+ - "\u0000\u04a3\u04a4\u0005e\u0000\u0000\u04a4\u04a5\u0005f\u0000\u0000\u04a5"+ - "\u04a6\u0005e\u0000\u0000\u04a6\u04a7\u0005r\u0000\u0000\u04a7\u04a8\u0005"+ - "e\u0000\u0000\u04a8\u04a9\u0005n\u0000\u0000\u04a9\u04aa\u0005c\u0000"+ - "\u0000\u04aa\u04ab\u0005e\u0000\u0000\u04abw\u0001\u0000\u0000\u0000\u04ac"+ - "\u04ad\u0005\\\u0000\u0000\u04ad\u04ae\u0005i\u0000\u0000\u04ae\u04af"+ - "\u0005s\u0000\u0000\u04af\u04b0\u0005R\u0000\u0000\u04b0\u04b1\u0005e"+ - "\u0000\u0000\u04b1\u04b2\u0005f\u0000\u0000\u04b2\u04b3\u0005e\u0000\u0000"+ - "\u04b3\u04b4\u0005r\u0000\u0000\u04b4\u04b5\u0005e\u0000\u0000\u04b5\u04b6"+ - "\u0005n\u0000\u0000\u04b6\u04b7\u0005c\u0000\u0000\u04b7\u04b8\u0005e"+ - "\u0000\u0000\u04b8\u04b9\u0005A\u0000\u0000\u04b9\u04ba\u0005r\u0000\u0000"+ - "\u04ba\u04bb\u0005r\u0000\u0000\u04bb\u04bc\u0005a\u0000\u0000\u04bc\u04bd"+ - "\u0005y\u0000\u0000\u04bdy\u0001\u0000\u0000\u0000\u04be\u04bf\u0005\\"+ - "\u0000\u0000\u04bf\u04c0\u0005i\u0000\u0000\u04c0\u04c1\u0005s\u0000\u0000"+ - "\u04c1\u04c2\u0005S\u0000\u0000\u04c2\u04c3\u0005t\u0000\u0000\u04c3\u04c4"+ - "\u0005a\u0000\u0000\u04c4\u04c5\u0005t\u0000\u0000\u04c5\u04c6\u0005i"+ - "\u0000\u0000\u04c6\u04c7\u0005c\u0000\u0000\u04c7\u04c8\u0005F\u0000\u0000"+ - "\u04c8\u04c9\u0005i\u0000\u0000\u04c9\u04ca\u0005e\u0000\u0000\u04ca\u04cb"+ - "\u0005l\u0000\u0000\u04cb\u04cc\u0005d\u0000\u0000\u04cc{\u0001\u0000"+ - "\u0000\u0000\u04cd\u04ce\u0005\\\u0000\u0000\u04ce\u04cf\u0005i\u0000"+ - "\u0000\u04cf\u04d0\u0005s\u0000\u0000\u04d0\u04d1\u0005I\u0000\u0000\u04d1"+ - "\u04d2\u0005n\u0000\u0000\u04d2\u04d3\u0005S\u0000\u0000\u04d3\u04d4\u0005"+ - "t\u0000\u0000\u04d4\u04d5\u0005r\u0000\u0000\u04d5\u04d6\u0005i\u0000"+ - "\u0000\u04d6\u04d7\u0005c\u0000\u0000\u04d7\u04d8\u0005t\u0000\u0000\u04d8"+ - "\u04d9\u0005F\u0000\u0000\u04d9\u04da\u0005p\u0000\u0000\u04da}\u0001"+ - "\u0000\u0000\u0000\u04db\u04dc\u0005\\\u0000\u0000\u04dc\u04dd\u0005s"+ - "\u0000\u0000\u04dd\u04de\u0005u\u0000\u0000\u04de\u04df\u0005b\u0000\u0000"+ - "\u04df\u007f\u0001\u0000\u0000\u0000\u04e0\u04e1\u0005\\\u0000\u0000\u04e1"+ - "\u04e2\u0005e\u0000\u0000\u04e2\u04e3\u0005q\u0000\u0000\u04e3\u04e4\u0005"+ - "u\u0000\u0000\u04e4\u04e5\u0005a\u0000\u0000\u04e5\u04e6\u0005l\u0000"+ - "\u0000\u04e6\u04e7\u0005U\u0000\u0000\u04e7\u04e8\u0005n\u0000\u0000\u04e8"+ - "\u04e9\u0005i\u0000\u0000\u04e9\u04ea\u0005q\u0000\u0000\u04ea\u04eb\u0005"+ - "u\u0000\u0000\u04eb\u04ec\u0005e\u0000\u0000\u04ec\u0081\u0001\u0000\u0000"+ - "\u0000\u04ed\u04ee\u0005\\\u0000\u0000\u04ee\u04ef\u0005n\u0000\u0000"+ - "\u04ef\u04f0\u0005e\u0000\u0000\u04f0\u04f1\u0005w\u0000\u0000\u04f1\u0083"+ - "\u0001\u0000\u0000\u0000\u04f2\u04f3\u0005\\\u0000\u0000\u04f3\u04f4\u0005"+ - "n\u0000\u0000\u04f4\u04f5\u0005e\u0000\u0000\u04f5\u04f6\u0005w\u0000"+ - "\u0000\u04f6\u04f7\u0005T\u0000\u0000\u04f7\u04f8\u0005y\u0000\u0000\u04f8"+ - "\u04f9\u0005p\u0000\u0000\u04f9\u04fa\u0005e\u0000\u0000\u04fa\u04fb\u0005"+ - "O\u0000\u0000\u04fb\u04fc\u0005f\u0000\u0000\u04fc\u0085\u0001\u0000\u0000"+ - "\u0000\u04fd\u04fe\u0005\\\u0000\u0000\u04fe\u04ff\u0005n\u0000\u0000"+ - "\u04ff\u0500\u0005e\u0000\u0000\u0500\u0501\u0005w\u0000\u0000\u0501\u0502"+ - "\u0005D\u0000\u0000\u0502\u0503\u0005e\u0000\u0000\u0503\u0504\u0005p"+ - "\u0000\u0000\u0504\u0505\u0005e\u0000\u0000\u0505\u0506\u0005n\u0000\u0000"+ - "\u0506\u0507\u0005d\u0000\u0000\u0507\u0508\u0005i\u0000\u0000\u0508\u0509"+ - "\u0005n\u0000\u0000\u0509\u050a\u0005g\u0000\u0000\u050a\u050b\u0005O"+ - "\u0000\u0000\u050b\u050c\u0005n\u0000\u0000\u050c\u0087\u0001\u0000\u0000"+ - "\u0000\u050d\u050e\u0005\\\u0000\u0000\u050e\u050f\u0005h\u0000\u0000"+ - "\u050f\u0510\u0005a\u0000\u0000\u0510\u0511\u0005s\u0000\u0000\u0511\u0512"+ - "\u0005E\u0000\u0000\u0512\u0513\u0005l\u0000\u0000\u0513\u0514\u0005e"+ - "\u0000\u0000\u0514\u0515\u0005m\u0000\u0000\u0515\u0516\u0005e\u0000\u0000"+ - "\u0516\u0517\u0005n\u0000\u0000\u0517\u0518\u0005t\u0000\u0000\u0518\u0519"+ - "\u0005a\u0000\u0000\u0519\u051a\u0005r\u0000\u0000\u051a\u051b\u0005y"+ - "\u0000\u0000\u051b\u051c\u0005S\u0000\u0000\u051c\u051d\u0005o\u0000\u0000"+ - "\u051d\u051e\u0005r\u0000\u0000\u051e\u051f\u0005t\u0000\u0000\u051f\u0089"+ - "\u0001\u0000\u0000\u0000\u0520\u0521\u0005\\\u0000\u0000\u0521\u0522\u0005"+ - "n\u0000\u0000\u0522\u0523\u0005e\u0000\u0000\u0523\u0524\u0005w\u0000"+ - "\u0000\u0524\u0525\u0005L\u0000\u0000\u0525\u0526\u0005a\u0000\u0000\u0526"+ - "\u0527\u0005b\u0000\u0000\u0527\u0528\u0005e\u0000\u0000\u0528\u0529\u0005"+ - "l\u0000\u0000\u0529\u008b\u0001\u0000\u0000\u0000\u052a\u052b\u0005\\"+ - "\u0000\u0000\u052b\u052c\u0005c\u0000\u0000\u052c\u052d\u0005o\u0000\u0000"+ - "\u052d\u052e\u0005n\u0000\u0000\u052e\u052f\u0005t\u0000\u0000\u052f\u0530"+ - "\u0005a\u0000\u0000\u0530\u0531\u0005i\u0000\u0000\u0531\u0532\u0005n"+ - "\u0000\u0000\u0532\u0533\u0005s\u0000\u0000\u0533\u0534\u0005A\u0000\u0000"+ - "\u0534\u0535\u0005s\u0000\u0000\u0535\u0536\u0005s\u0000\u0000\u0536\u0537"+ - "\u0005i\u0000\u0000\u0537\u0538\u0005g\u0000\u0000\u0538\u0539\u0005n"+ - "\u0000\u0000\u0539\u053a\u0005m\u0000\u0000\u053a\u053b\u0005e\u0000\u0000"+ - "\u053b\u053c\u0005n\u0000\u0000\u053c\u053d\u0005t\u0000\u0000\u053d\u008d"+ - "\u0001\u0000\u0000\u0000\u053e\u053f\u0005\\\u0000\u0000\u053f\u0540\u0005"+ - "n\u0000\u0000\u0540\u0541\u0005o\u0000\u0000\u0541\u0542\u0005t\u0000"+ - "\u0000\u0542\u008f\u0001\u0000\u0000\u0000\u0543\u0544\u0005\\\u0000\u0000"+ - "\u0544\u0545\u0005n\u0000\u0000\u0545\u0546\u0005o\u0000\u0000\u0546\u0547"+ - "\u0005t\u0000\u0000\u0547\u0548\u0005F\u0000\u0000\u0548\u0549\u0005r"+ - "\u0000\u0000\u0549\u054a\u0005e\u0000\u0000\u054a\u054b\u0005e\u0000\u0000"+ - "\u054b\u054c\u0005I\u0000\u0000\u054c\u054d\u0005n\u0000\u0000\u054d\u0091"+ - "\u0001\u0000\u0000\u0000\u054e\u054f\u0005\\\u0000\u0000\u054f\u0550\u0005"+ - "s\u0000\u0000\u0550\u0551\u0005a\u0000\u0000\u0551\u0552\u0005m\u0000"+ - "\u0000\u0552\u0553\u0005e\u0000\u0000\u0553\u0093\u0001\u0000\u0000\u0000"+ - "\u0554\u0555\u0005\\\u0000\u0000\u0555\u0556\u0005s\u0000\u0000\u0556"+ - "\u0557\u0005t\u0000\u0000\u0557\u0558\u0005a\u0000\u0000\u0558\u0559\u0005"+ - "t\u0000\u0000\u0559\u055a\u0005i\u0000\u0000\u055a\u055b\u0005c\u0000"+ - "\u0000\u055b\u0095\u0001\u0000\u0000\u0000\u055c\u055d\u0005\\\u0000\u0000"+ - "\u055d\u055e\u0005s\u0000\u0000\u055e\u055f\u0005t\u0000\u0000\u055f\u0560"+ - "\u0005a\u0000\u0000\u0560\u0561\u0005t\u0000\u0000\u0561\u0562\u0005i"+ - "\u0000\u0000\u0562\u0563\u0005c\u0000\u0000\u0563\u0564\u0005M\u0000\u0000"+ - "\u0564\u0565\u0005e\u0000\u0000\u0565\u0566\u0005t\u0000\u0000\u0566\u0567"+ - "\u0005h\u0000\u0000\u0567\u0568\u0005o\u0000\u0000\u0568\u0569\u0005d"+ - "\u0000\u0000\u0569\u056a\u0005R\u0000\u0000\u056a\u056b\u0005e\u0000\u0000"+ - "\u056b\u056c\u0005f\u0000\u0000\u056c\u056d\u0005e\u0000\u0000\u056d\u056e"+ - "\u0005r\u0000\u0000\u056e\u056f\u0005e\u0000\u0000\u056f\u0570\u0005n"+ - "\u0000\u0000\u0570\u0571\u0005c\u0000\u0000\u0571\u0572\u0005e\u0000\u0000"+ - "\u0572\u0097\u0001\u0000\u0000\u0000\u0573\u0574\u0005\\\u0000\u0000\u0574"+ - "\u0575\u0005m\u0000\u0000\u0575\u0576\u0005a\u0000\u0000\u0576\u0577\u0005"+ - "y\u0000\u0000\u0577\u0578\u0005E\u0000\u0000\u0578\u0579\u0005x\u0000"+ - "\u0000\u0579\u057a\u0005p\u0000\u0000\u057a\u057b\u0005a\u0000\u0000\u057b"+ - "\u057c\u0005n\u0000\u0000\u057c\u057d\u0005d\u0000\u0000\u057d\u057e\u0005"+ - "M\u0000\u0000\u057e\u057f\u0005e\u0000\u0000\u057f\u0580\u0005t\u0000"+ - "\u0000\u0580\u0581\u0005h\u0000\u0000\u0581\u0582\u0005o\u0000\u0000\u0582"+ - "\u0583\u0005d\u0000\u0000\u0583\u0099\u0001\u0000\u0000\u0000\u0584\u0585"+ - "\u0005\\\u0000\u0000\u0585\u0586\u0005s\u0000\u0000\u0586\u0587\u0005"+ - "t\u0000\u0000\u0587\u0588\u0005r\u0000\u0000\u0588\u0589\u0005i\u0000"+ - "\u0000\u0589\u058a\u0005c\u0000\u0000\u058a\u058b\u0005t\u0000\u0000\u058b"+ - "\u009b\u0001\u0000\u0000\u0000\u058c\u058d\u0005\\\u0000\u0000\u058d\u058e"+ - "\u0005t\u0000\u0000\u058e\u058f\u0005y\u0000\u0000\u058f\u0590\u0005p"+ - "\u0000\u0000\u0590\u0591\u0005e\u0000\u0000\u0591\u0592\u0005o\u0000\u0000"+ - "\u0592\u0593\u0005f\u0000\u0000\u0593\u009d\u0001\u0000\u0000\u0000\u0594"+ - "\u0595\u0005\\\u0000\u0000\u0595\u0596\u0005i\u0000\u0000\u0596\u0597"+ - "\u0005n\u0000\u0000\u0597\u0598\u0005s\u0000\u0000\u0598\u0599\u0005t"+ - "\u0000\u0000\u0599\u059a\u0005a\u0000\u0000\u059a\u059b\u0005n\u0000\u0000"+ - "\u059b\u059c\u0005t\u0000\u0000\u059c\u059d\u0005i\u0000\u0000\u059d\u059e"+ - "\u0005a\u0000\u0000\u059e\u059f\u0005t\u0000\u0000\u059f\u05a0\u0005e"+ - "\u0000\u0000\u05a0\u05a1\u0005G\u0000\u0000\u05a1\u05a2\u0005e\u0000\u0000"+ - "\u05a2\u05a3\u0005n\u0000\u0000\u05a3\u05a4\u0005e\u0000\u0000\u05a4\u05a5"+ - "\u0005r\u0000\u0000\u05a5\u05a6\u0005i\u0000\u0000\u05a6\u05a7\u0005c"+ - "\u0000\u0000\u05a7\u009f\u0001\u0000\u0000\u0000\u05a8\u05a9\u0005\\\u0000"+ - "\u0000\u05a9\u05aa\u0005f\u0000\u0000\u05aa\u05ab\u0005o\u0000\u0000\u05ab"+ - "\u05ac\u0005r\u0000\u0000\u05ac\u05ad\u0005a\u0000\u0000\u05ad\u05ae\u0005"+ - "l\u0000\u0000\u05ae\u05b1\u0005l\u0000\u0000\u05af\u05b1\u0005\u2200\u0000"+ - "\u0000\u05b0\u05a8\u0001\u0000\u0000\u0000\u05b0\u05af\u0001\u0000\u0000"+ - "\u0000\u05b1\u00a1\u0001\u0000\u0000\u0000\u05b2\u05b3\u0005\\\u0000\u0000"+ - "\u05b3\u05b4\u0005e\u0000\u0000\u05b4\u05b5\u0005x\u0000\u0000\u05b5\u05b6"+ - "\u0005i\u0000\u0000\u05b6\u05b7\u0005s\u0000\u0000\u05b7\u05b8\u0005t"+ - "\u0000\u0000\u05b8\u05bb\u0005s\u0000\u0000\u05b9\u05bb\u0005\u2203\u0000"+ - "\u0000\u05ba\u05b2\u0001\u0000\u0000\u0000\u05ba\u05b9\u0001\u0000\u0000"+ - "\u0000\u05bb\u00a3\u0001\u0000\u0000\u0000\u05bc\u05bd\u0005\\\u0000\u0000"+ - "\u05bd\u05be\u0005s\u0000\u0000\u05be\u05bf\u0005u\u0000\u0000\u05bf\u05c0"+ - "\u0005b\u0000\u0000\u05c0\u05c1\u0005s\u0000\u0000\u05c1\u05c2\u0005t"+ - "\u0000\u0000\u05c2\u00a5\u0001\u0000\u0000\u0000\u05c3\u05c4\u0005\\\u0000"+ - "\u0000\u05c4\u05c5\u0005i\u0000\u0000\u05c5\u05c6\u0005f\u0000\u0000\u05c6"+ - "\u00a7\u0001\u0000\u0000\u0000\u05c7\u05c8\u0005\\\u0000\u0000\u05c8\u05c9"+ - "\u0005i\u0000\u0000\u05c9\u05ca\u0005f\u0000\u0000\u05ca\u05cb\u0005E"+ - "\u0000\u0000\u05cb\u05cc\u0005x\u0000\u0000\u05cc\u00a9\u0001\u0000\u0000"+ - "\u0000\u05cd\u05ce\u0005\\\u0000\u0000\u05ce\u05cf\u0005t\u0000\u0000"+ - "\u05cf\u05d0\u0005h\u0000\u0000\u05d0\u05d1\u0005e\u0000\u0000\u05d1\u05d2"+ - "\u0005n\u0000\u0000\u05d2\u00ab\u0001\u0000\u0000\u0000\u05d3\u05d4\u0005"+ - "\\\u0000\u0000\u05d4\u05d5\u0005e\u0000\u0000\u05d5\u05d6\u0005l\u0000"+ - "\u0000\u05d6\u05d7\u0005s\u0000\u0000\u05d7\u05d8\u0005e\u0000\u0000\u05d8"+ - "\u00ad\u0001\u0000\u0000\u0000\u05d9\u05da\u0005\\\u0000\u0000\u05da\u05db"+ - "\u0005i\u0000\u0000\u05db\u05dc\u0005n\u0000\u0000\u05dc\u05dd\u0005c"+ - "\u0000\u0000\u05dd\u05de\u0005l\u0000\u0000\u05de\u05df\u0005u\u0000\u0000"+ - "\u05df\u05e0\u0005d\u0000\u0000\u05e0\u05e1\u0005e\u0000\u0000\u05e1\u00af"+ - "\u0001\u0000\u0000\u0000\u05e2\u05e3\u0005\\\u0000\u0000\u05e3\u05e4\u0005"+ - "i\u0000\u0000\u05e4\u05e5\u0005n\u0000\u0000\u05e5\u05e6\u0005c\u0000"+ - "\u0000\u05e6\u05e7\u0005l\u0000\u0000\u05e7\u05e8\u0005u\u0000\u0000\u05e8"+ - "\u05e9\u0005d\u0000\u0000\u05e9\u05ea\u0005e\u0000\u0000\u05ea\u05eb\u0005"+ - "L\u0000\u0000\u05eb\u05ec\u0005D\u0000\u0000\u05ec\u05ed\u0005T\u0000"+ - "\u0000\u05ed\u05ee\u0005s\u0000\u0000\u05ee\u00b1\u0001\u0000\u0000\u0000"+ - "\u05ef\u05f0\u0005\\\u0000\u0000\u05f0\u05f1\u0005c\u0000\u0000\u05f1"+ - "\u05f2\u0005l\u0000\u0000\u05f2\u05f3\u0005a\u0000\u0000\u05f3\u05f4\u0005"+ - "s\u0000\u0000\u05f4\u05f5\u0005s\u0000\u0000\u05f5\u05f6\u0005p\u0000"+ - "\u0000\u05f6\u05f7\u0005a\u0000\u0000\u05f7\u05f8\u0005t\u0000\u0000\u05f8"+ - "\u05f9\u0005h\u0000\u0000\u05f9\u00b3\u0001\u0000\u0000\u0000\u05fa\u05fb"+ - "\u0005\\\u0000\u0000\u05fb\u05fc\u0005b\u0000\u0000\u05fc\u05fd\u0005"+ - "o\u0000\u0000\u05fd\u05fe\u0005o\u0000\u0000\u05fe\u05ff\u0005t\u0000"+ - "\u0000\u05ff\u0600\u0005c\u0000\u0000\u0600\u0601\u0005l\u0000\u0000\u0601"+ - "\u0602\u0005a\u0000\u0000\u0602\u0603\u0005s\u0000\u0000\u0603\u0604\u0005"+ - "s\u0000\u0000\u0604\u0605\u0005p\u0000\u0000\u0605\u0606\u0005a\u0000"+ - "\u0000\u0606\u0607\u0005t\u0000\u0000\u0607\u0608\u0005h\u0000\u0000\u0608"+ - "\u00b5\u0001\u0000\u0000\u0000\u0609\u060a\u0005\\\u0000\u0000\u060a\u060b"+ - "\u0005n\u0000\u0000\u060b\u060c\u0005o\u0000\u0000\u060c\u060d\u0005D"+ - "\u0000\u0000\u060d\u060e\u0005e\u0000\u0000\u060e\u060f\u0005f\u0000\u0000"+ - "\u060f\u0610\u0005a\u0000\u0000\u0610\u0611\u0005u\u0000\u0000\u0611\u0612"+ - "\u0005l\u0000\u0000\u0612\u0613\u0005t\u0000\u0000\u0613\u0614\u0005C"+ - "\u0000\u0000\u0614\u0615\u0005l\u0000\u0000\u0615\u0616\u0005a\u0000\u0000"+ - "\u0616\u0617\u0005s\u0000\u0000\u0617\u0618\u0005s\u0000\u0000\u0618\u0619"+ - "\u0005e\u0000\u0000\u0619\u061a\u0005s\u0000\u0000\u061a\u00b7\u0001\u0000"+ - "\u0000\u0000\u061b\u061c\u0005\\\u0000\u0000\u061c\u061d\u0005j\u0000"+ - "\u0000\u061d\u061e\u0005a\u0000\u0000\u061e\u061f\u0005v\u0000\u0000\u061f"+ - "\u0620\u0005a\u0000\u0000\u0620\u0621\u0005S\u0000\u0000\u0621\u0622\u0005"+ - "o\u0000\u0000\u0622\u0623\u0005u\u0000\u0000\u0623\u0624\u0005r\u0000"+ - "\u0000\u0624\u0625\u0005c\u0000\u0000\u0625\u0626\u0005e\u0000\u0000\u0626"+ - "\u00b9\u0001\u0000\u0000\u0000\u0627\u0628\u0005\\\u0000\u0000\u0628\u0629"+ - "\u0005w\u0000\u0000\u0629\u062a\u0005i\u0000\u0000\u062a\u062b\u0005t"+ - "\u0000\u0000\u062b\u062c\u0005h\u0000\u0000\u062c\u062d\u0005O\u0000\u0000"+ - "\u062d\u062e\u0005p\u0000\u0000\u062e\u062f\u0005t\u0000\u0000\u062f\u0630"+ - "\u0005i\u0000\u0000\u0630\u0631\u0005o\u0000\u0000\u0631\u0632\u0005n"+ - "\u0000\u0000\u0632\u0633\u0005s\u0000\u0000\u0633\u00bb\u0001\u0000\u0000"+ - "\u0000\u0634\u0635\u0005\\\u0000\u0000\u0635\u0636\u0005o\u0000\u0000"+ - "\u0636\u0637\u0005p\u0000\u0000\u0637\u0638\u0005t\u0000\u0000\u0638\u0639"+ - "\u0005i\u0000\u0000\u0639\u063a\u0005o\u0000\u0000\u063a\u063b\u0005n"+ - "\u0000\u0000\u063b\u063c\u0005s\u0000\u0000\u063c\u063d\u0005D\u0000\u0000"+ - "\u063d\u063e\u0005e\u0000\u0000\u063e\u063f\u0005c\u0000\u0000\u063f\u0640"+ - "\u0005l\u0000\u0000\u0640\u00bd\u0001\u0000\u0000\u0000\u0641\u0642\u0005"+ - "\\\u0000\u0000\u0642\u0643\u0005s\u0000\u0000\u0643\u0644\u0005e\u0000"+ - "\u0000\u0644\u0645\u0005t\u0000\u0000\u0645\u0646\u0005t\u0000\u0000\u0646"+ - "\u0647\u0005i\u0000\u0000\u0647\u0648\u0005n\u0000\u0000\u0648\u0649\u0005"+ - "g\u0000\u0000\u0649\u064a\u0005s\u0000\u0000\u064a\u00bf\u0001\u0000\u0000"+ - "\u0000\u064b\u064c\u0005\\\u0000\u0000\u064c\u064d\u0005p\u0000\u0000"+ - "\u064d\u064e\u0005r\u0000\u0000\u064e\u064f\u0005o\u0000\u0000\u064f\u0650"+ - "\u0005f\u0000\u0000\u0650\u0651\u0005i\u0000\u0000\u0651\u0652\u0005l"+ - "\u0000\u0000\u0652\u0653\u0005e\u0000\u0000\u0653\u00c1\u0001\u0000\u0000"+ - "\u0000\u0654\u0655\u0005t\u0000\u0000\u0655\u0656\u0005r\u0000\u0000\u0656"+ - "\u0657\u0005u\u0000\u0000\u0657\u0658\u0005e\u0000\u0000\u0658\u00c3\u0001"+ - "\u0000\u0000\u0000\u0659\u065a\u0005f\u0000\u0000\u065a\u065b\u0005a\u0000"+ - "\u0000\u065b\u065c\u0005l\u0000\u0000\u065c\u065d\u0005s\u0000\u0000\u065d"+ - "\u065e\u0005e\u0000\u0000\u065e\u00c5\u0001\u0000\u0000\u0000\u065f\u0660"+ - "\u0005\\\u0000\u0000\u0660\u0661\u0005s\u0000\u0000\u0661\u0662\u0005"+ - "a\u0000\u0000\u0662\u0663\u0005m\u0000\u0000\u0663\u0664\u0005e\u0000"+ - "\u0000\u0664\u0665\u0005U\u0000\u0000\u0665\u0666\u0005p\u0000\u0000\u0666"+ - "\u0667\u0005d\u0000\u0000\u0667\u0668\u0005a\u0000\u0000\u0668\u0669\u0005"+ - "t\u0000\u0000\u0669\u066a\u0005e\u0000\u0000\u066a\u066b\u0005L\u0000"+ - "\u0000\u066b\u066c\u0005e\u0000\u0000\u066c\u066d\u0005v\u0000\u0000\u066d"+ - "\u066e\u0005e\u0000\u0000\u066e\u066f\u0005l\u0000\u0000\u066f\u00c7\u0001"+ - "\u0000\u0000\u0000\u0670\u0671\u0005\\\u0000\u0000\u0671\u0672\u0005i"+ - "\u0000\u0000\u0672\u0673\u0005n\u0000\u0000\u0673\u0674\u0005S\u0000\u0000"+ - "\u0674\u0675\u0005e\u0000\u0000\u0675\u0676\u0005q\u0000\u0000\u0676\u0677"+ - "\u0005u\u0000\u0000\u0677\u0678\u0005e\u0000\u0000\u0678\u0679\u0005n"+ - "\u0000\u0000\u0679\u067a\u0005t\u0000\u0000\u067a\u067b\u0005S\u0000\u0000"+ - "\u067b\u067c\u0005t\u0000\u0000\u067c\u067d\u0005a\u0000\u0000\u067d\u067e"+ - "\u0005t\u0000\u0000\u067e\u067f\u0005e\u0000\u0000\u067f\u00c9\u0001\u0000"+ - "\u0000\u0000\u0680\u0681\u0005\\\u0000\u0000\u0681\u0682\u0005a\u0000"+ - "\u0000\u0682\u0683\u0005n\u0000\u0000\u0683\u0684\u0005t\u0000\u0000\u0684"+ - "\u0685\u0005e\u0000\u0000\u0685\u0686\u0005c\u0000\u0000\u0686\u0687\u0005"+ - "e\u0000\u0000\u0687\u0688\u0005d\u0000\u0000\u0688\u0689\u0005e\u0000"+ - "\u0000\u0689\u068a\u0005n\u0000\u0000\u068a\u068b\u0005t\u0000\u0000\u068b"+ - "\u068c\u0005P\u0000\u0000\u068c\u068d\u0005o\u0000\u0000\u068d\u068e\u0005"+ - "l\u0000\u0000\u068e\u068f\u0005a\u0000\u0000\u068f\u0690\u0005r\u0000"+ - "\u0000\u0690\u0691\u0005i\u0000\u0000\u0691\u0692\u0005t\u0000\u0000\u0692"+ - "\u0693\u0005y\u0000\u0000\u0693\u00cb\u0001\u0000\u0000\u0000\u0694\u0695"+ - "\u0005\\\u0000\u0000\u0695\u0696\u0005s\u0000\u0000\u0696\u0697\u0005"+ - "u\u0000\u0000\u0697\u0698\u0005c\u0000\u0000\u0698\u0699\u0005c\u0000"+ - "\u0000\u0699\u069a\u0005e\u0000\u0000\u069a\u069b\u0005d\u0000\u0000\u069b"+ - "\u069c\u0005e\u0000\u0000\u069c\u069d\u0005n\u0000\u0000\u069d\u069e\u0005"+ - "t\u0000\u0000\u069e\u069f\u0005P\u0000\u0000\u069f\u06a0\u0005o\u0000"+ - "\u0000\u06a0\u06a1\u0005l\u0000\u0000\u06a1\u06a2\u0005a\u0000\u0000\u06a2"+ - "\u06a3\u0005r\u0000\u0000\u06a3\u06a4\u0005i\u0000\u0000\u06a4\u06a5\u0005"+ - "t\u0000\u0000\u06a5\u06a6\u0005y\u0000\u0000\u06a6\u00cd\u0001\u0000\u0000"+ - "\u0000\u06a7\u06a8\u0005\\\u0000\u0000\u06a8\u06a9\u0005c\u0000\u0000"+ - "\u06a9\u06aa\u0005l\u0000\u0000\u06aa\u06ab\u0005o\u0000\u0000\u06ab\u06ac"+ - "\u0005s\u0000\u0000\u06ac\u06ad\u0005e\u0000\u0000\u06ad\u06ae\u0005g"+ - "\u0000\u0000\u06ae\u06af\u0005o\u0000\u0000\u06af\u06b0\u0005a\u0000\u0000"+ - "\u06b0\u06b1\u0005l\u0000\u0000\u06b1\u00cf\u0001\u0000\u0000\u0000\u06b2"+ - "\u06b3\u0005\\\u0000\u0000\u06b3\u06b4\u0005h\u0000\u0000\u06b4\u06b5"+ - "\u0005e\u0000\u0000\u06b5\u06b6\u0005u\u0000\u0000\u06b6\u06b7\u0005r"+ - "\u0000\u0000\u06b7\u06b8\u0005i\u0000\u0000\u06b8\u06b9\u0005s\u0000\u0000"+ - "\u06b9\u06ba\u0005t\u0000\u0000\u06ba\u06bb\u0005i\u0000\u0000\u06bb\u06bc"+ - "\u0005c\u0000\u0000\u06bc\u06bd\u0005s\u0000\u0000\u06bd\u06be\u0005D"+ - "\u0000\u0000\u06be\u06bf\u0005e\u0000\u0000\u06bf\u06c0\u0005c\u0000\u0000"+ - "\u06c0\u06c1\u0005l\u0000\u0000\u06c1\u00d1\u0001\u0000\u0000\u0000\u06c2"+ - "\u06c3\u0005\\\u0000\u0000\u06c3\u06c4\u0005n\u0000\u0000\u06c4\u06c5"+ - "\u0005o\u0000\u0000\u06c5\u06c6\u0005n\u0000\u0000\u06c6\u06c7\u0005i"+ - "\u0000\u0000\u06c7\u06c8\u0005n\u0000\u0000\u06c8\u06c9\u0005t\u0000\u0000"+ - "\u06c9\u06ca\u0005e\u0000\u0000\u06ca\u06cb\u0005r\u0000\u0000\u06cb\u06cc"+ - "\u0005a\u0000\u0000\u06cc\u06cd\u0005c\u0000\u0000\u06cd\u06ce\u0005t"+ - "\u0000\u0000\u06ce\u06cf\u0005i\u0000\u0000\u06cf\u06d0\u0005v\u0000\u0000"+ - "\u06d0\u06d1\u0005e\u0000\u0000\u06d1\u00d3\u0001\u0000\u0000\u0000\u06d2"+ - "\u06d3\u0005\\\u0000\u0000\u06d3\u06d4\u0005d\u0000\u0000\u06d4\u06d5"+ - "\u0005i\u0000\u0000\u06d5\u06d6\u0005s\u0000\u0000\u06d6\u06d7\u0005p"+ - "\u0000\u0000\u06d7\u06d8\u0005l\u0000\u0000\u06d8\u06d9\u0005a\u0000\u0000"+ - "\u06d9\u06da\u0005y\u0000\u0000\u06da\u06db\u0005n\u0000\u0000\u06db\u06dc"+ - "\u0005a\u0000\u0000\u06dc\u06dd\u0005m\u0000\u0000\u06dd\u06de\u0005e"+ - "\u0000\u0000\u06de\u00d5\u0001\u0000\u0000\u0000\u06df\u06e0\u0005\\\u0000"+ - "\u0000\u06e0\u06e1\u0005h\u0000\u0000\u06e1\u06e2\u0005e\u0000\u0000\u06e2"+ - "\u06e3\u0005l\u0000\u0000\u06e3\u06e4\u0005p\u0000\u0000\u06e4\u06e5\u0005"+ - "t\u0000\u0000\u06e5\u06e6\u0005e\u0000\u0000\u06e6\u06e7\u0005x\u0000"+ - "\u0000\u06e7\u06e8\u0005t\u0000\u0000\u06e8\u00d7\u0001\u0000\u0000\u0000"+ - "\u06e9\u06ea\u0005\\\u0000\u0000\u06ea\u06eb\u0005r\u0000\u0000\u06eb"+ - "\u06ec\u0005e\u0000\u0000\u06ec\u06ed\u0005p\u0000\u0000\u06ed\u06ee\u0005"+ - "l\u0000\u0000\u06ee\u06ef\u0005a\u0000\u0000\u06ef\u06f0\u0005c\u0000"+ - "\u0000\u06f0\u06f1\u0005e\u0000\u0000\u06f1\u06f2\u0005w\u0000\u0000\u06f2"+ - "\u06f3\u0005i\u0000\u0000\u06f3\u06f4\u0005t\u0000\u0000\u06f4\u06f5\u0005"+ - "h\u0000\u0000\u06f5\u00d9\u0001\u0000\u0000\u0000\u06f6\u06f7\u0005\\"+ - "\u0000\u0000\u06f7\u06f8\u0005a\u0000\u0000\u06f8\u06f9\u0005d\u0000\u0000"+ - "\u06f9\u06fa\u0005d\u0000\u0000\u06fa\u06fb\u0005r\u0000\u0000\u06fb\u06fc"+ - "\u0005u\u0000\u0000\u06fc\u06fd\u0005l\u0000\u0000\u06fd\u06fe\u0005e"+ - "\u0000\u0000\u06fe\u06ff\u0005s\u0000\u0000\u06ff\u00db\u0001\u0000\u0000"+ - "\u0000\u0700\u0701\u0005\\\u0000\u0000\u0701\u0702\u0005a\u0000\u0000"+ - "\u0702\u0703\u0005d\u0000\u0000\u0703\u0704\u0005d\u0000\u0000\u0704\u0705"+ - "\u0005p\u0000\u0000\u0705\u0706\u0005r\u0000\u0000\u0706\u0707\u0005o"+ - "\u0000\u0000\u0707\u0708\u0005g\u0000\u0000\u0708\u0709\u0005v\u0000\u0000"+ - "\u0709\u070a\u0005a\u0000\u0000\u070a\u070b\u0005r\u0000\u0000\u070b\u070c"+ - "\u0005s\u0000\u0000\u070c\u00dd\u0001\u0000\u0000\u0000\u070d\u070e\u0005"+ - "\\\u0000\u0000\u070e\u070f\u0005h\u0000\u0000\u070f\u0710\u0005e\u0000"+ - "\u0000\u0710\u0711\u0005u\u0000\u0000\u0711\u0712\u0005r\u0000\u0000\u0712"+ - "\u0713\u0005i\u0000\u0000\u0713\u0714\u0005s\u0000\u0000\u0714\u0715\u0005"+ - "t\u0000\u0000\u0715\u0716\u0005i\u0000\u0000\u0716\u0717\u0005c\u0000"+ - "\u0000\u0717\u0718\u0005s\u0000\u0000\u0718\u00df\u0001\u0000\u0000\u0000"+ - "\u0719\u071a\u0005\\\u0000\u0000\u071a\u071b\u0005f\u0000\u0000\u071b"+ - "\u071c\u0005i\u0000\u0000\u071c\u071d\u0005n\u0000\u0000\u071d\u071e\u0005"+ - "d\u0000\u0000\u071e\u00e1\u0001\u0000\u0000\u0000\u071f\u0720\u0005\\"+ - "\u0000\u0000\u0720\u0721\u0005a\u0000\u0000\u0721\u0722\u0005d\u0000\u0000"+ - "\u0722\u0723\u0005d\u0000\u0000\u0723\u00e3\u0001\u0000\u0000\u0000\u0724"+ - "\u0725\u0005\\\u0000\u0000\u0725\u0726\u0005a\u0000\u0000\u0726\u0727"+ - "\u0005s\u0000\u0000\u0727\u0728\u0005s\u0000\u0000\u0728\u0729\u0005u"+ - "\u0000\u0000\u0729\u072a\u0005m\u0000\u0000\u072a\u072b\u0005e\u0000\u0000"+ - "\u072b\u072c\u0005s\u0000\u0000\u072c\u00e5\u0001\u0000\u0000\u0000\u072d"+ - "\u072e\u0005\\\u0000\u0000\u072e\u072f\u0005t\u0000\u0000\u072f\u0730"+ - "\u0005r\u0000\u0000\u0730\u0731\u0005i\u0000\u0000\u0731\u0732\u0005g"+ - "\u0000\u0000\u0732\u0733\u0005g\u0000\u0000\u0733\u0734\u0005e\u0000\u0000"+ - "\u0734\u0735\u0005r\u0000\u0000\u0735\u00e7\u0001\u0000\u0000\u0000\u0736"+ - "\u0737\u0005\\\u0000\u0000\u0737\u0738\u0005a\u0000\u0000\u0738\u0739"+ - "\u0005v\u0000\u0000\u0739\u073a\u0005o\u0000\u0000\u073a\u073b\u0005i"+ - "\u0000\u0000\u073b\u073c\u0005d\u0000\u0000\u073c\u00e9\u0001\u0000\u0000"+ - "\u0000\u073d\u073e\u0005\\\u0000\u0000\u073e\u073f\u0005p\u0000\u0000"+ - "\u073f\u0740\u0005r\u0000\u0000\u0740\u0741\u0005e\u0000\u0000\u0741\u0742"+ - "\u0005d\u0000\u0000\u0742\u0743\u0005i\u0000\u0000\u0743\u0744\u0005c"+ - "\u0000\u0000\u0744\u0745\u0005a\u0000\u0000\u0745\u0746\u0005t\u0000\u0000"+ - "\u0746\u0747\u0005e\u0000\u0000\u0747\u0748\u0005s\u0000\u0000\u0748\u00eb"+ - "\u0001\u0000\u0000\u0000\u0749\u074a\u0005\\\u0000\u0000\u074a\u074b\u0005"+ - "f\u0000\u0000\u074b\u074c\u0005u\u0000\u0000\u074c\u074d\u0005n\u0000"+ - "\u0000\u074d\u074e\u0005c\u0000\u0000\u074e\u074f\u0005t\u0000\u0000\u074f"+ - "\u0750\u0005i\u0000\u0000\u0750\u0751\u0005o\u0000\u0000\u0751\u0752\u0005"+ - "n\u0000\u0000\u0752\u0753\u0005s\u0000\u0000\u0753\u00ed\u0001\u0000\u0000"+ - "\u0000\u0754\u0755\u0005\\\u0000\u0000\u0755\u0756\u0005t\u0000\u0000"+ - "\u0756\u0757\u0005r\u0000\u0000\u0757\u0758\u0005a\u0000\u0000\u0758\u0759"+ - "\u0005n\u0000\u0000\u0759\u075a\u0005s\u0000\u0000\u075a\u075b\u0005f"+ - "\u0000\u0000\u075b\u075c\u0005o\u0000\u0000\u075c\u075d\u0005r\u0000\u0000"+ - "\u075d\u075e\u0005m\u0000\u0000\u075e\u075f\u0005e\u0000\u0000\u075f\u0760"+ - "\u0005r\u0000\u0000\u0760\u0761\u0005s\u0000\u0000\u0761\u00ef\u0001\u0000"+ - "\u0000\u0000\u0762\u0763\u0005\\\u0000\u0000\u0763\u0764\u0005u\u0000"+ - "\u0000\u0764\u0765\u0005n\u0000\u0000\u0765\u0766\u0005i\u0000\u0000\u0766"+ - "\u0767\u0005q\u0000\u0000\u0767\u0768\u0005u\u0000\u0000\u0768\u0769\u0005"+ - "e\u0000\u0000\u0769\u00f1\u0001\u0000\u0000\u0000\u076a\u076b\u0005\\"+ - "\u0000\u0000\u076b\u076c\u0005r\u0000\u0000\u076c\u076d\u0005u\u0000\u0000"+ - "\u076d\u076e\u0005l\u0000\u0000\u076e\u076f\u0005e\u0000\u0000\u076f\u0770"+ - "\u0005s\u0000\u0000\u0770\u00f3\u0001\u0000\u0000\u0000\u0771\u0772\u0005"+ - "\\\u0000\u0000\u0772\u0773\u0005a\u0000\u0000\u0773\u0774\u0005x\u0000"+ - "\u0000\u0774\u0775\u0005i\u0000\u0000\u0775\u0776\u0005o\u0000\u0000\u0776"+ - "\u0777\u0005m\u0000\u0000\u0777\u0778\u0005s\u0000\u0000\u0778\u00f5\u0001"+ - "\u0000\u0000\u0000\u0779\u077a\u0005\\\u0000\u0000\u077a\u077b\u0005p"+ - "\u0000\u0000\u077b\u077c\u0005r\u0000\u0000\u077c\u077d\u0005o\u0000\u0000"+ - "\u077d\u077e\u0005b\u0000\u0000\u077e\u077f\u0005l\u0000\u0000\u077f\u0780"+ - "\u0005e\u0000\u0000\u0780\u0781\u0005m\u0000\u0000\u0781\u00f7\u0001\u0000"+ - "\u0000\u0000\u0782\u0783\u0005\\\u0000\u0000\u0783\u0784\u0005c\u0000"+ - "\u0000\u0784\u0785\u0005h\u0000\u0000\u0785\u0786\u0005o\u0000\u0000\u0786"+ - "\u0787\u0005o\u0000\u0000\u0787\u0788\u0005s\u0000\u0000\u0788\u0789\u0005"+ - "e\u0000\u0000\u0789\u078a\u0005C\u0000\u0000\u078a\u078b\u0005o\u0000"+ - "\u0000\u078b\u078c\u0005n\u0000\u0000\u078c\u078d\u0005t\u0000\u0000\u078d"+ - "\u078e\u0005r\u0000\u0000\u078e\u078f\u0005a\u0000\u0000\u078f\u0790\u0005"+ - "c\u0000\u0000\u0790\u0791\u0005t\u0000\u0000\u0791\u00f9\u0001\u0000\u0000"+ - "\u0000\u0792\u0793\u0005\\\u0000\u0000\u0793\u0794\u0005p\u0000\u0000"+ - "\u0794\u0795\u0005r\u0000\u0000\u0795\u0796\u0005o\u0000\u0000\u0796\u0797"+ - "\u0005o\u0000\u0000\u0797\u0798\u0005f\u0000\u0000\u0798\u0799\u0005O"+ - "\u0000\u0000\u0799\u079a\u0005b\u0000\u0000\u079a\u079b\u0005l\u0000\u0000"+ - "\u079b\u079c\u0005i\u0000\u0000\u079c\u079d\u0005g\u0000\u0000\u079d\u079e"+ - "\u0005a\u0000\u0000\u079e\u079f\u0005t\u0000\u0000\u079f\u07a0\u0005i"+ - "\u0000\u0000\u07a0\u07a1\u0005o\u0000\u0000\u07a1\u07a2\u0005n\u0000\u0000"+ - "\u07a2\u00fb\u0001\u0000\u0000\u0000\u07a3\u07a4\u0005\\\u0000\u0000\u07a4"+ - "\u07a5\u0005p\u0000\u0000\u07a5\u07a6\u0005r\u0000\u0000\u07a6\u07a7\u0005"+ - "o\u0000\u0000\u07a7\u07a8\u0005o\u0000\u0000\u07a8\u07a9\u0005f\u0000"+ - "\u0000\u07a9\u00fd\u0001\u0000\u0000\u0000\u07aa\u07ab\u0005\\\u0000\u0000"+ - "\u07ab\u07ac\u0005p\u0000\u0000\u07ac\u07ad\u0005r\u0000\u0000\u07ad\u07ae"+ - "\u0005o\u0000\u0000\u07ae\u07af\u0005o\u0000\u0000\u07af\u07b0\u0005f"+ - "\u0000\u0000\u07b0\u07b1\u0005S\u0000\u0000\u07b1\u07b2\u0005c\u0000\u0000"+ - "\u07b2\u07b3\u0005r\u0000\u0000\u07b3\u07b4\u0005i\u0000\u0000\u07b4\u07b5"+ - "\u0005p\u0000\u0000\u07b5\u07b6\u0005t\u0000\u0000\u07b6\u00ff\u0001\u0000"+ - "\u0000\u0000\u07b7\u07b8\u0005\\\u0000\u0000\u07b8\u07b9\u0005c\u0000"+ - "\u0000\u07b9\u07ba\u0005o\u0000\u0000\u07ba\u07bb\u0005n\u0000\u0000\u07bb"+ - "\u07bc\u0005t\u0000\u0000\u07bc\u07bd\u0005r\u0000\u0000\u07bd\u07be\u0005"+ - "a\u0000\u0000\u07be\u07bf\u0005c\u0000\u0000\u07bf\u07c0\u0005t\u0000"+ - "\u0000\u07c0\u07c1\u0005s\u0000\u0000\u07c1\u0101\u0001\u0000\u0000\u0000"+ - "\u07c2\u07c3\u0005\\\u0000\u0000\u07c3\u07c4\u0005i\u0000\u0000\u07c4"+ - "\u07c5\u0005n\u0000\u0000\u07c5\u07c6\u0005v\u0000\u0000\u07c6\u07c7\u0005"+ - "a\u0000\u0000\u07c7\u07c8\u0005r\u0000\u0000\u07c8\u07c9\u0005i\u0000"+ - "\u0000\u07c9\u07ca\u0005a\u0000\u0000\u07ca\u07cb\u0005n\u0000\u0000\u07cb"+ - "\u07cc\u0005t\u0000\u0000\u07cc\u07cd\u0005s\u0000\u0000\u07cd\u0103\u0001"+ - "\u0000\u0000\u0000\u07ce\u07cf\u0005\\\u0000\u0000\u07cf\u07d0\u0005l"+ - "\u0000\u0000\u07d0\u07d1\u0005e\u0000\u0000\u07d1\u07d2\u0005m\u0000\u0000"+ - "\u07d2\u07d3\u0005m\u0000\u0000\u07d3\u07d4\u0005a\u0000\u0000\u07d4\u0105"+ - "\u0001\u0000\u0000\u0000\u07d5\u07d6\u0005\\\u0000\u0000\u07d6\u07d7\u0005"+ - "i\u0000\u0000\u07d7\u07d8\u0005n\u0000\u0000\u07d8\u07d9\u0005T\u0000"+ - "\u0000\u07d9\u07da\u0005y\u0000\u0000\u07da\u07db\u0005p\u0000\u0000\u07db"+ - "\u07dc\u0005e\u0000\u0000\u07dc\u0107\u0001\u0000\u0000\u0000\u07dd\u07de"+ - "\u0005\\\u0000\u0000\u07de\u07df\u0005i\u0000\u0000\u07df\u07e0\u0005"+ - "s\u0000\u0000\u07e0\u07e1\u0005A\u0000\u0000\u07e1\u07e2\u0005b\u0000"+ - "\u0000\u07e2\u07e3\u0005s\u0000\u0000\u07e3\u07e4\u0005t\u0000\u0000\u07e4"+ - "\u07e5\u0005r\u0000\u0000\u07e5\u07e6\u0005a\u0000\u0000\u07e6\u07e7\u0005"+ - "c\u0000\u0000\u07e7\u07e8\u0005t\u0000\u0000\u07e8\u07e9\u0005O\u0000"+ - "\u0000\u07e9\u07ea\u0005r\u0000\u0000\u07ea\u07eb\u0005I\u0000\u0000\u07eb"+ - "\u07ec\u0005n\u0000\u0000\u07ec\u07ed\u0005t\u0000\u0000\u07ed\u07ee\u0005"+ - "e\u0000\u0000\u07ee\u07ef\u0005r\u0000\u0000\u07ef\u07f0\u0005f\u0000"+ - "\u0000\u07f0\u07f1\u0005a\u0000\u0000\u07f1\u07f2\u0005c\u0000\u0000\u07f2"+ - "\u07f3\u0005e\u0000\u0000\u07f3\u0109\u0001\u0000\u0000\u0000\u07f4\u07f5"+ - "\u0005\\\u0000\u0000\u07f5\u07f6\u0005c\u0000\u0000\u07f6\u07f7\u0005"+ - "o\u0000\u0000\u07f7\u07f8\u0005n\u0000\u0000\u07f8\u07f9\u0005t\u0000"+ - "\u0000\u07f9\u07fa\u0005a\u0000\u0000\u07fa\u07fb\u0005i\u0000\u0000\u07fb"+ - "\u07fc\u0005n\u0000\u0000\u07fc\u07fd\u0005e\u0000\u0000\u07fd\u07fe\u0005"+ - "r\u0000\u0000\u07fe\u07ff\u0005T\u0000\u0000\u07ff\u0800\u0005y\u0000"+ - "\u0000\u0800\u0801\u0005p\u0000\u0000\u0801\u0802\u0005e\u0000\u0000\u0802"+ - "\u010b\u0001\u0000\u0000\u0000\u0803\u0804\u0005\u227a\u0000\u0000\u0804"+ - "\u010d\u0001\u0000\u0000\u0000\u0805\u0806\u0005\u220a\u0000\u0000\u0806"+ - "\u010f\u0001\u0000\u0000\u0000\u0807\u0808\u0005\u2205\u0000\u0000\u0808"+ - "\u0111\u0001\u0000\u0000\u0000\u0809\u080a\u0005\u222a\u0000\u0000\u080a"+ - "\u0113\u0001\u0000\u0000\u0000\u080b\u080c\u0005\u2229\u0000\u0000\u080c"+ - "\u0115\u0001\u0000\u0000\u0000\u080d\u080e\u0005\u2286\u0000\u0000\u080e"+ - "\u0117\u0001\u0000\u0000\u0000\u080f\u0810\u0005\u2216\u0000\u0000\u0810"+ - "\u0119\u0001\u0000\u0000\u0000\u0811\u0812\u0002\u0003\u0377\u0000\u0812"+ - "\u011b\u0001\u0000\u0000\u0000\u0813\u0814\u0005;\u0000\u0000\u0814\u011d"+ - "\u0001\u0000\u0000\u0000\u0815\u0816\u0005/\u0000\u0000\u0816\u011f\u0001"+ - "\u0000\u0000\u0000\u0817\u0818\u0005:\u0000\u0000\u0818\u0121\u0001\u0000"+ - "\u0000\u0000\u0819\u081a\u0005:\u0000\u0000\u081a\u081b\u0005:\u0000\u0000"+ - "\u081b\u0123\u0001\u0000\u0000\u0000\u081c\u081d\u0005:\u0000\u0000\u081d"+ - "\u081e\u0005=\u0000\u0000\u081e\u0125\u0001\u0000\u0000\u0000\u081f\u0820"+ - "\u0005.\u0000\u0000\u0820\u0127\u0001\u0000\u0000\u0000\u0821\u0822\u0005"+ - ".\u0000\u0000\u0822\u0823\u0005.\u0000\u0000\u0823\u0129\u0001\u0000\u0000"+ - "\u0000\u0824\u0825\u0005,\u0000\u0000\u0825\u012b\u0001\u0000\u0000\u0000"+ - "\u0826\u0827\u0005(\u0000\u0000\u0827\u012d\u0001\u0000\u0000\u0000\u0828"+ - "\u0829\u0005)\u0000\u0000\u0829\u012f\u0001\u0000\u0000\u0000\u082a\u082b"+ - "\u0005{\u0000\u0000\u082b\u0131\u0001\u0000\u0000\u0000\u082c\u082d\u0005"+ - "}\u0000\u0000\u082d\u0133\u0001\u0000\u0000\u0000\u082e\u082f\u0005[\u0000"+ - "\u0000\u082f\u0135\u0001\u0000\u0000\u0000\u0830\u0831\u0005]\u0000\u0000"+ - "\u0831\u0137\u0001\u0000\u0000\u0000\u0832\u0833\u0005[\u0000\u0000\u0833"+ - "\u0834\u0005]\u0000\u0000\u0834\u0139\u0001\u0000\u0000\u0000\u0835\u0836"+ - "\u0005@\u0000\u0000\u0836\u013b\u0001\u0000\u0000\u0000\u0837\u0838\u0005"+ - "|\u0000\u0000\u0838\u0839\u0005|\u0000\u0000\u0839\u013d\u0001\u0000\u0000"+ - "\u0000\u083a\u083b\u0007\u0000\u0000\u0000\u083b\u013f\u0001\u0000\u0000"+ - "\u0000\u083c\u083d\u0007\u0001\u0000\u0000\u083d\u0141\u0001\u0000\u0000"+ - "\u0000\u083e\u083f\u0007\u0002\u0000\u0000\u083f\u0143\u0001\u0000\u0000"+ - "\u0000\u0840\u0841\u0005-\u0000\u0000\u0841\u0844\u0005>\u0000\u0000\u0842"+ - "\u0844\u0005\u2192\u0000\u0000\u0843\u0840\u0001\u0000\u0000\u0000\u0843"+ - "\u0842\u0001\u0000\u0000\u0000\u0844\u0145\u0001\u0000\u0000\u0000\u0845"+ - "\u0846\u0005=\u0000\u0000\u0846\u0147\u0001\u0000\u0000\u0000\u0847\u0848"+ - "\u0005!\u0000\u0000\u0848\u084b\u0005=\u0000\u0000\u0849\u084b\u0005\u2260"+ - "\u0000\u0000\u084a\u0847\u0001\u0000\u0000\u0000\u084a\u0849\u0001\u0000"+ - "\u0000\u0000\u084b\u0149\u0001\u0000\u0000\u0000\u084c\u084d\u0005=\u0000"+ - "\u0000\u084d\u084e\u0005=\u0000\u0000\u084e\u0851\u0005>\u0000\u0000\u084f"+ - "\u0851\u0005\u27f9\u0000\u0000\u0850\u084c\u0001\u0000\u0000\u0000\u0850"+ - "\u084f\u0001\u0000\u0000\u0000\u0851\u014b\u0001\u0000\u0000\u0000\u0852"+ - "\u0853\u0005^\u0000\u0000\u0853\u014d\u0001\u0000\u0000\u0000\u0854\u0855"+ - "\u0005~\u0000\u0000\u0855\u014f\u0001\u0000\u0000\u0000\u0856\u0857\u0005"+ - "%\u0000\u0000\u0857\u0151\u0001\u0000\u0000\u0000\u0858\u0859\u0005*\u0000"+ - "\u0000\u0859\u0153\u0001\u0000\u0000\u0000\u085a\u085b\u0005-\u0000\u0000"+ - "\u085b\u0155\u0001\u0000\u0000\u0000\u085c\u085d\u0005+\u0000\u0000\u085d"+ - "\u0157\u0001\u0000\u0000\u0000\u085e\u085f\u0005>\u0000\u0000\u085f\u0159"+ - "\u0001\u0000\u0000\u0000\u0860\u0861\u0005>\u0000\u0000\u0861\u0864\u0005"+ - "=\u0000\u0000\u0862\u0864\u0005\u2265\u0000\u0000\u0863\u0860\u0001\u0000"+ - "\u0000\u0000\u0863\u0862\u0001\u0000\u0000\u0000\u0864\u015b\u0001\u0000"+ - "\u0000\u0000\u0865\u0866\u0005>\u0000\u0000\u0866\u0867\u0005>\u0000\u0000"+ - "\u0867\u015d\u0001\u0000\u0000\u0000\u0868\u086a\u0007\u0003\u0000\u0000"+ - "\u0869\u0868\u0001\u0000\u0000\u0000\u086a\u086b\u0001\u0000\u0000\u0000"+ - "\u086b\u0869\u0001\u0000\u0000\u0000\u086b\u086c\u0001\u0000\u0000\u0000"+ - "\u086c\u086d\u0001\u0000\u0000\u0000\u086d\u086e\u0006\u00aa\u0000\u0000"+ - "\u086e\u015f\u0001\u0000\u0000\u0000\u086f\u0875\u0005\"\u0000\u0000\u0870"+ - "\u0871\u0005\\\u0000\u0000\u0871\u0874\t\u0000\u0000\u0000\u0872\u0874"+ - "\b\u0004\u0000\u0000\u0873\u0870\u0001\u0000\u0000\u0000\u0873\u0872\u0001"+ - "\u0000\u0000\u0000\u0874\u0877\u0001\u0000\u0000\u0000\u0875\u0873\u0001"+ - "\u0000\u0000\u0000\u0875\u0876\u0001\u0000\u0000\u0000\u0876\u0878\u0001"+ - "\u0000\u0000\u0000\u0877\u0875\u0001\u0000\u0000\u0000\u0878\u0879\u0005"+ - "\"\u0000\u0000\u0879\u0161\u0001\u0000\u0000\u0000\u087a\u087b\u0005<"+ - "\u0000\u0000\u087b\u0163\u0001\u0000\u0000\u0000\u087c\u087d\u0005<\u0000"+ - "\u0000\u087d\u0880\u0005=\u0000\u0000\u087e\u0880\u0005\u2264\u0000\u0000"+ - "\u087f\u087c\u0001\u0000\u0000\u0000\u087f\u087e\u0001\u0000\u0000\u0000"+ - "\u0880\u0165\u0001\u0000\u0000\u0000\u0881\u0882\u0005<\u0000\u0000\u0882"+ - "\u0883\u0005<\u0000\u0000\u0883\u0167\u0001\u0000\u0000\u0000\u0884\u0886"+ - "\u0005<\u0000\u0000\u0885\u0887\u0003\u0180\u00bb\u0000\u0886\u0885\u0001"+ - "\u0000\u0000\u0000\u0887\u0888\u0001\u0000\u0000\u0000\u0888\u0886\u0001"+ - "\u0000\u0000\u0000\u0888\u0889\u0001\u0000\u0000\u0000\u0889\u088a\u0001"+ - "\u0000\u0000\u0000\u088a\u0890\u0005>\u0000\u0000\u088b\u088c\u0005$\u0000"+ - "\u0000\u088c\u088d\u0005l\u0000\u0000\u088d\u088e\u0005m\u0000\u0000\u088e"+ - "\u088f\u0005t\u0000\u0000\u088f\u0891\u0005d\u0000\u0000\u0890\u088b\u0001"+ - "\u0000\u0000\u0000\u0890\u0891\u0001\u0000\u0000\u0000\u0891\u0892\u0001"+ - "\u0000\u0000\u0000\u0892\u0893\u0006\u00af\u0001\u0000\u0893\u0169\u0001"+ - "\u0000\u0000\u0000\u0894\u0895\u0005<\u0000\u0000\u0895\u0896\u0005-\u0000"+ - "\u0000\u0896\u0899\u0005>\u0000\u0000\u0897\u0899\u0005\u2194\u0000\u0000"+ - "\u0898\u0894\u0001\u0000\u0000\u0000\u0898\u0897\u0001\u0000\u0000\u0000"+ - "\u0899\u016b\u0001\u0000\u0000\u0000\u089a\u089c\u0005\'\u0000\u0000\u089b"+ - "\u089a\u0001\u0000\u0000\u0000\u089c\u089d\u0001\u0000\u0000\u0000\u089d"+ - "\u089b\u0001\u0000\u0000\u0000\u089d\u089e\u0001\u0000\u0000\u0000\u089e"+ - "\u016d\u0001\u0000\u0000\u0000\u089f\u08a7\u0005\'\u0000\u0000\u08a0\u08a8"+ - "\u0007\u0005\u0000\u0000\u08a1\u08a5\u0005\\\u0000\u0000\u08a2\u08a6\u0007"+ - "\u0006\u0000\u0000\u08a3\u08a4\u0005u\u0000\u0000\u08a4\u08a6\u0003\u017e"+ - "\u00ba\u0000\u08a5\u08a2\u0001\u0000\u0000\u0000\u08a5\u08a3\u0001\u0000"+ - "\u0000\u0000\u08a6\u08a8\u0001\u0000\u0000\u0000\u08a7\u08a0\u0001\u0000"+ - "\u0000\u0000\u08a7\u08a1\u0001\u0000\u0000\u0000\u08a8\u08a9\u0001\u0000"+ - "\u0000\u0000\u08a9\u08aa\u0005\'\u0000\u0000\u08aa\u016f\u0001\u0000\u0000"+ - "\u0000\u08ab\u08b2\u0005\"\u0000\u0000\u08ac\u08ad\u0005\\\u0000\u0000"+ - "\u08ad\u08b1\t\u0000\u0000\u0000\u08ae\u08b1\u0005\n\u0000\u0000\u08af"+ - "\u08b1\b\u0007\u0000\u0000\u08b0\u08ac\u0001\u0000\u0000\u0000\u08b0\u08ae"+ - "\u0001\u0000\u0000\u0000\u08b0\u08af\u0001\u0000\u0000\u0000\u08b1\u08b4"+ - "\u0001\u0000\u0000\u0000\u08b2\u08b0\u0001\u0000\u0000\u0000\u08b2\u08b3"+ - "\u0001\u0000\u0000\u0000\u08b3\u08b5\u0001\u0000\u0000\u0000\u08b4\u08b2"+ - "\u0001\u0000\u0000\u0000\u08b5\u08b6\u0005\"\u0000\u0000\u08b6\u0171\u0001"+ - "\u0000\u0000\u0000\u08b7\u08b8\u0005/\u0000\u0000\u08b8\u08b9\u0005/\u0000"+ - "\u0000\u08b9\u08bd\u0001\u0000\u0000\u0000\u08ba\u08bc\b\b\u0000\u0000"+ - "\u08bb\u08ba\u0001\u0000\u0000\u0000\u08bc\u08bf\u0001\u0000\u0000\u0000"+ - "\u08bd\u08bb\u0001\u0000\u0000\u0000\u08bd\u08be\u0001\u0000\u0000\u0000"+ - "\u08be\u08c1\u0001\u0000\u0000\u0000\u08bf\u08bd\u0001\u0000\u0000\u0000"+ - "\u08c0\u08c2\u0007\t\u0000\u0000\u08c1\u08c0\u0001\u0000\u0000\u0000\u08c2"+ - "\u08c3\u0001\u0000\u0000\u0000\u08c3\u08c4\u0006\u00b4\u0000\u0000\u08c4"+ - "\u0173\u0001\u0000\u0000\u0000\u08c5\u08c6\u0005/\u0000\u0000\u08c6\u08c7"+ - "\u0005*\u0000\u0000\u08c7\u08c8\u0005!\u0000\u0000\u08c8\u08c9\u0001\u0000"+ - "\u0000\u0000\u08c9\u08ca\u0006\u00b5\u0002\u0000\u08ca\u08cb\u0006\u00b5"+ - "\u0003\u0000\u08cb\u0175\u0001\u0000\u0000\u0000\u08cc\u08cd\u0005/\u0000"+ - "\u0000\u08cd\u08ce\u0005*\u0000\u0000\u08ce\u08cf\u0001\u0000\u0000\u0000"+ - "\u08cf\u08d0\u0006\u00b6\u0002\u0000\u08d0\u08d1\u0006\u00b6\u0004\u0000"+ - "\u08d1\u0177\u0001\u0000\u0000\u0000\u08d2\u08d3\u00050\u0000\u0000\u08d3"+ - "\u08d5\u0005b\u0000\u0000\u08d4\u08d6\u0007\n\u0000\u0000\u08d5\u08d4"+ - "\u0001\u0000\u0000\u0000\u08d6\u08d7\u0001\u0000\u0000\u0000\u08d7\u08d5"+ - "\u0001\u0000\u0000\u0000\u08d7\u08d8\u0001\u0000\u0000\u0000\u08d8\u08da"+ - "\u0001\u0000\u0000\u0000\u08d9\u08db\u0007\u000b\u0000\u0000\u08da\u08d9"+ - "\u0001\u0000\u0000\u0000\u08da\u08db\u0001\u0000\u0000\u0000\u08db\u0179"+ - "\u0001\u0000\u0000\u0000\u08dc\u08dd\u00050\u0000\u0000\u08dd\u08e0\u0005"+ - "x\u0000\u0000\u08de\u08e1\u0003\u017c\u00b9\u0000\u08df\u08e1\u0007\f"+ - "\u0000\u0000\u08e0\u08de\u0001\u0000\u0000\u0000\u08e0\u08df\u0001\u0000"+ - "\u0000\u0000\u08e1\u08e2\u0001\u0000\u0000\u0000\u08e2\u08e0\u0001\u0000"+ - "\u0000\u0000\u08e2\u08e3\u0001\u0000\u0000\u0000\u08e3\u08e5\u0001\u0000"+ - "\u0000\u0000\u08e4\u08e6\u0007\u000b\u0000\u0000\u08e5\u08e4\u0001\u0000"+ - "\u0000\u0000\u08e5\u08e6\u0001\u0000\u0000\u0000\u08e6\u017b\u0001\u0000"+ - "\u0000\u0000\u08e7\u08e8\u000209\u0000\u08e8\u017d\u0001\u0000\u0000\u0000"+ - "\u08e9\u08ec\u0007\r\u0000\u0000\u08ea\u08ec\u0003\u017c\u00b9\u0000\u08eb"+ - "\u08e9\u0001\u0000\u0000\u0000\u08eb\u08ea\u0001\u0000\u0000\u0000\u08ec"+ - "\u08ef\u0001\u0000\u0000\u0000\u08ed\u08f0\u0007\r\u0000\u0000\u08ee\u08f0"+ - "\u0003\u017c\u00b9\u0000\u08ef\u08ed\u0001\u0000\u0000\u0000\u08ef\u08ee"+ - "\u0001\u0000\u0000\u0000\u08f0\u08f3\u0001\u0000\u0000\u0000\u08f1\u08f4"+ - "\u0007\r\u0000\u0000\u08f2\u08f4\u0003\u017c\u00b9\u0000\u08f3\u08f1\u0001"+ - "\u0000\u0000\u0000\u08f3\u08f2\u0001\u0000\u0000\u0000\u08f4\u08f7\u0001"+ - "\u0000\u0000\u0000\u08f5\u08f8\u0007\r\u0000\u0000\u08f6\u08f8\u0003\u017c"+ - "\u00b9\u0000\u08f7\u08f5\u0001\u0000\u0000\u0000\u08f7\u08f6\u0001\u0000"+ - "\u0000\u0000\u08f8\u017f\u0001\u0000\u0000\u0000\u08f9\u08fa\u0007\u000e"+ - "\u0000\u0000\u08fa\u0181\u0001\u0000\u0000\u0000\u08fb\u08ff\u0003\u0180"+ - "\u00bb\u0000\u08fc\u08ff\u0003\u017c\u00b9\u0000\u08fd\u08ff\u0007\u000f"+ - "\u0000\u0000\u08fe\u08fb\u0001\u0000\u0000\u0000\u08fe\u08fc\u0001\u0000"+ - "\u0000\u0000\u08fe\u08fd\u0001\u0000\u0000\u0000\u08ff\u0183\u0001\u0000"+ - "\u0000\u0000\u0900\u0903\u0003\u0180\u00bb\u0000\u0901\u0903\u0007\u000f"+ - "\u0000\u0000\u0902\u0900\u0001\u0000\u0000\u0000\u0902\u0901\u0001\u0000"+ - "\u0000\u0000\u0903\u0907\u0001\u0000\u0000\u0000\u0904\u0906\u0003\u0182"+ - "\u00bc\u0000\u0905\u0904\u0001\u0000\u0000\u0000\u0906\u0909\u0001\u0000"+ - "\u0000\u0000\u0907\u0905\u0001\u0000\u0000\u0000\u0907\u0908\u0001\u0000"+ - "\u0000\u0000\u0908\u0185\u0001\u0000\u0000\u0000\u0909\u0907\u0001\u0000"+ - "\u0000\u0000\u090a\u090d\u0003\u017c\u00b9\u0000\u090b\u090d\u0005_\u0000"+ - "\u0000\u090c\u090a\u0001\u0000\u0000\u0000\u090c\u090b\u0001\u0000\u0000"+ - "\u0000\u090d\u090e\u0001\u0000\u0000\u0000\u090e\u090c\u0001\u0000\u0000"+ - "\u0000\u090e\u090f\u0001\u0000\u0000\u0000\u090f\u0911\u0001\u0000\u0000"+ - "\u0000\u0910\u0912\u0007\u000b\u0000\u0000\u0911\u0910\u0001\u0000\u0000"+ - "\u0000\u0911\u0912\u0001\u0000\u0000\u0000\u0912\u0187\u0001\u0000\u0000"+ - "\u0000\u0913\u0915\u0007\u0010\u0000\u0000\u0914\u0916\u0007\u0011\u0000"+ - "\u0000\u0915\u0914\u0001\u0000\u0000\u0000\u0915\u0916\u0001\u0000\u0000"+ - "\u0000\u0916\u0918\u0001\u0000\u0000\u0000\u0917\u0919\u0003\u017c\u00b9"+ - "\u0000\u0918\u0917\u0001\u0000\u0000\u0000\u0919\u091a\u0001\u0000\u0000"+ - "\u0000\u091a\u0918\u0001\u0000\u0000\u0000\u091a\u091b\u0001\u0000\u0000"+ - "\u0000\u091b\u0189\u0001\u0000\u0000\u0000\u091c\u091e\u0003\u017c\u00b9"+ - "\u0000\u091d\u091c\u0001\u0000\u0000\u0000\u091e\u091f\u0001\u0000\u0000"+ - "\u0000\u091f\u091d\u0001\u0000\u0000\u0000\u091f\u0920\u0001\u0000\u0000"+ - "\u0000\u0920\u0928\u0001\u0000\u0000\u0000\u0921\u0925\u0005.\u0000\u0000"+ - "\u0922\u0924\u0003\u017c\u00b9\u0000\u0923\u0922\u0001\u0000\u0000\u0000"+ - "\u0924\u0927\u0001\u0000\u0000\u0000\u0925\u0923\u0001\u0000\u0000\u0000"+ - "\u0925\u0926\u0001\u0000\u0000\u0000\u0926\u0929\u0001\u0000\u0000\u0000"+ - "\u0927\u0925\u0001\u0000\u0000\u0000\u0928\u0921\u0001\u0000\u0000\u0000"+ - "\u0928\u0929\u0001\u0000\u0000\u0000\u0929\u092b\u0001\u0000\u0000\u0000"+ - "\u092a\u092c\u0003\u0188\u00bf\u0000\u092b\u092a\u0001\u0000\u0000\u0000"+ - "\u092b\u092c\u0001\u0000\u0000\u0000\u092c\u0937\u0001\u0000\u0000\u0000"+ - "\u092d\u092f\u0005.\u0000\u0000\u092e\u0930\u0003\u017c\u00b9\u0000\u092f"+ - "\u092e\u0001\u0000\u0000\u0000\u0930\u0931\u0001\u0000\u0000\u0000\u0931"+ - "\u092f\u0001\u0000\u0000\u0000\u0931\u0932\u0001\u0000\u0000\u0000\u0932"+ - "\u0934\u0001\u0000\u0000\u0000\u0933\u0935\u0003\u0188\u00bf\u0000\u0934"+ - "\u0933\u0001\u0000\u0000\u0000\u0934\u0935\u0001\u0000\u0000\u0000\u0935"+ - "\u0937\u0001\u0000\u0000\u0000\u0936\u091d\u0001\u0000\u0000\u0000\u0936"+ - "\u092d\u0001\u0000\u0000\u0000\u0937\u018b\u0001\u0000\u0000\u0000\u0938"+ - "\u0939\u0003\u018a\u00c0\u0000\u0939\u093a\u0007\u0012\u0000\u0000\u093a"+ - "\u018d\u0001\u0000\u0000\u0000\u093b\u093c\u0003\u018a\u00c0\u0000\u093c"+ - "\u093d\u0007\u0013\u0000\u0000\u093d\u018f\u0001\u0000\u0000\u0000\u093e"+ - "\u093f\u0003\u018a\u00c0\u0000\u093f\u0940\u0007\u0014\u0000\u0000\u0940"+ - "\u0191\u0001\u0000\u0000\u0000\u0941\u0942\u0005\\\u0000\u0000\u0942\u0943"+ - "\u0005<\u0000\u0000\u0943\u0944\u0001\u0000\u0000\u0000\u0944\u0945\u0006"+ - "\u00c4\u0002\u0000\u0945\u0946\u0006\u00c4\u0005\u0000\u0946\u0193\u0001"+ - "\u0000\u0000\u0000\u0947\u0948\u0005\\\u0000\u0000\u0948\u0949\u0005["+ - "\u0000\u0000\u0949\u094a\u0001\u0000\u0000\u0000\u094a\u094b\u0006\u00c5"+ - "\u0002\u0000\u094b\u094c\u0006\u00c5\u0006\u0000\u094c\u0195\u0001\u0000"+ - "\u0000\u0000\u094d\u094e\u0005\\\u0000\u0000\u094e\u094f\u0005[\u0000"+ - "\u0000\u094f\u0950\u0005[\u0000\u0000\u0950\u0951\u0001\u0000\u0000\u0000"+ - "\u0951\u0952\u0006\u00c6\u0002\u0000\u0952\u0953\u0006\u00c6\u0007\u0000"+ - "\u0953\u0197\u0001\u0000\u0000\u0000\u0954\u0955\u0005\\\u0000\u0000\u0955"+ - "\u0956\u0005b\u0000\u0000\u0956\u0957\u0005o\u0000\u0000\u0957\u0958\u0005"+ - "x\u0000\u0000\u0958\u0959\u0001\u0000\u0000\u0000\u0959\u095a\u0006\u00c7"+ - "\u0002\u0000\u095a\u095b\u0006\u00c7\b\u0000\u095b\u0199\u0001\u0000\u0000"+ - "\u0000\u095c\u095d\u0005\\\u0000\u0000\u095d\u095e\u0005d\u0000\u0000"+ - "\u095e\u095f\u0005i\u0000\u0000\u095f\u0960\u0005a\u0000\u0000\u0960\u0961"+ - "\u0005m\u0000\u0000\u0961\u0962\u0005o\u0000\u0000\u0962\u0963\u0005n"+ - "\u0000\u0000\u0963\u0964\u0005d\u0000\u0000\u0964\u0965\u0001\u0000\u0000"+ - "\u0000\u0965\u0966\u0006\u00c8\u0002\u0000\u0966\u0967\u0006\u00c8\b\u0000"+ - "\u0967\u019b\u0001\u0000\u0000\u0000\u0968\u0969\u0005\\\u0000\u0000\u0969"+ - "\u096a\u0005d\u0000\u0000\u096a\u096b\u0005i\u0000\u0000\u096b\u096c\u0005"+ - "a\u0000\u0000\u096c\u096d\u0005m\u0000\u0000\u096d\u096e\u0005o\u0000"+ - "\u0000\u096e\u096f\u0005n\u0000\u0000\u096f\u0970\u0005d\u0000\u0000\u0970"+ - "\u0971\u0005_\u0000\u0000\u0971\u0972\u0005t\u0000\u0000\u0972\u0973\u0005"+ - "r\u0000\u0000\u0973\u0974\u0005a\u0000\u0000\u0974\u0975\u0005n\u0000"+ - "\u0000\u0975\u0976\u0005s\u0000\u0000\u0976\u0977\u0005a\u0000\u0000\u0977"+ - "\u0978\u0005c\u0000\u0000\u0978\u0979\u0005t\u0000\u0000\u0979\u097a\u0005"+ - "i\u0000\u0000\u097a\u097b\u0005o\u0000\u0000\u097b\u097c\u0005n\u0000"+ - "\u0000\u097c\u097d\u0001\u0000\u0000\u0000\u097d\u097e\u0006\u00c9\u0002"+ - "\u0000\u097e\u097f\u0006\u00c9\b\u0000\u097f\u019d\u0001\u0000\u0000\u0000"+ - "\u0980\u0981\u0005\\\u0000\u0000\u0981\u0982\u0005m\u0000\u0000\u0982"+ - "\u0983\u0005o\u0000\u0000\u0983\u0984\u0005d\u0000\u0000\u0984\u0985\u0005"+ - "a\u0000\u0000\u0985\u0986\u0005l\u0000\u0000\u0986\u0987\u0005i\u0000"+ - "\u0000\u0987\u0988\u0005t\u0000\u0000\u0988\u0989\u0005y\u0000\u0000\u0989"+ - "\u098a\u0001\u0000\u0000\u0000\u098a\u098b\u0006\u00ca\u0002\u0000\u098b"+ - "\u098c\u0006\u00ca\b\u0000\u098c\u019f\u0001\u0000\u0000\u0000\u098d\u098e"+ - "\u0005\\\u0000\u0000\u098e\u098f\u0005b\u0000\u0000\u098f\u0990\u0005"+ - "o\u0000\u0000\u0990\u0991\u0005x\u0000\u0000\u0991\u0992\u0005_\u0000"+ - "\u0000\u0992\u0993\u0005t\u0000\u0000\u0993\u0994\u0005r\u0000\u0000\u0994"+ - "\u0995\u0005a\u0000\u0000\u0995\u0996\u0005n\u0000\u0000\u0996\u0997\u0005"+ - "s\u0000\u0000\u0997\u0998\u0005a\u0000\u0000\u0998\u0999\u0005c\u0000"+ - "\u0000\u0999\u099a\u0005t\u0000\u0000\u099a\u099b\u0005i\u0000\u0000\u099b"+ - "\u099c\u0005o\u0000\u0000\u099c\u099d\u0005n\u0000\u0000\u099d\u099e\u0001"+ - "\u0000\u0000\u0000\u099e\u099f\u0006\u00cb\u0002\u0000\u099f\u09a0\u0006"+ - "\u00cb\b\u0000\u09a0\u01a1\u0001\u0000\u0000\u0000\u09a1\u09a2\u0005\\"+ - "\u0000\u0000\u09a2\u09a3\u0005t\u0000\u0000\u09a3\u09a4\u0005h\u0000\u0000"+ - "\u09a4\u09a5\u0005r\u0000\u0000\u09a5\u09a6\u0005o\u0000\u0000\u09a6\u09a7"+ - "\u0005u\u0000\u0000\u09a7\u09a8\u0005g\u0000\u0000\u09a8\u09a9\u0005h"+ - "\u0000\u0000\u09a9\u09aa\u0005o\u0000\u0000\u09aa\u09ab\u0005u\u0000\u0000"+ - "\u09ab\u09ac\u0005t\u0000\u0000\u09ac\u09ad\u0001\u0000\u0000\u0000\u09ad"+ - "\u09ae\u0006\u00cc\u0002\u0000\u09ae\u09af\u0006\u00cc\b\u0000\u09af\u01a3"+ - "\u0001\u0000\u0000\u0000\u09b0\u09b1\u0005\\\u0000\u0000\u09b1\u09b2\u0005"+ - "t\u0000\u0000\u09b2\u09b3\u0005h\u0000\u0000\u09b3\u09b4\u0005r\u0000"+ - "\u0000\u09b4\u09b5\u0005o\u0000\u0000\u09b5\u09b6\u0005u\u0000\u0000\u09b6"+ - "\u09b7\u0005g\u0000\u0000\u09b7\u09b8\u0005h\u0000\u0000\u09b8\u09b9\u0005"+ - "o\u0000\u0000\u09b9\u09ba\u0005u\u0000\u0000\u09ba\u09bb\u0005t\u0000"+ - "\u0000\u09bb\u09bc\u0005_\u0000\u0000\u09bc\u09bd\u0005t\u0000\u0000\u09bd"+ - "\u09be\u0005r\u0000\u0000\u09be\u09bf\u0005a\u0000\u0000\u09bf\u09c0\u0005"+ - "n\u0000\u0000\u09c0\u09c1\u0005s\u0000\u0000\u09c1\u09c2\u0005a\u0000"+ - "\u0000\u09c2\u09c3\u0005c\u0000\u0000\u09c3\u09c4\u0005t\u0000\u0000\u09c4"+ - "\u09c5\u0005i\u0000\u0000\u09c5\u09c6\u0005o\u0000\u0000\u09c6\u09c7\u0005"+ - "n\u0000\u0000\u09c7\u09c8\u0001\u0000\u0000\u0000\u09c8\u09c9\u0006\u00cd"+ - "\u0002\u0000\u09c9\u09ca\u0006\u00cd\b\u0000\u09ca\u01a5\u0001\u0000\u0000"+ - "\u0000\u09cb\u09cc\t\u0000\u0000\u0000\u09cc\u01a7\u0001\u0000\u0000\u0000"+ - "\u09cd\u09ce\u0005\\\u0000\u0000\u09ce\u09cf\u0005>\u0000\u0000\u09cf"+ - "\u09d0\u0001\u0000\u0000\u0000\u09d0\u09d1\u0006\u00cf\t\u0000\u09d1\u09d2"+ - "\u0006\u00cf\n\u0000\u09d2\u01a9\u0001\u0000\u0000\u0000\u09d3\u09d4\u0005"+ - "\"\u0000\u0000\u09d4\u09d5\u0001\u0000\u0000\u0000\u09d5\u09d6\u0006\u00d0"+ - "\u0002\u0000\u09d6\u09d7\u0006\u00d0\u000b\u0000\u09d7\u01ab\u0001\u0000"+ - "\u0000\u0000\u09d8\u09d9\u0005\'\u0000\u0000\u09d9\u09da\u0001\u0000\u0000"+ - "\u0000\u09da\u09db\u0006\u00d1\u0002\u0000\u09db\u09dc\u0006\u00d1\f\u0000"+ - "\u09dc\u01ad\u0001\u0000\u0000\u0000\u09dd\u09de\u0007\u0015\u0000\u0000"+ - "\u09de\u09df\u0007\u0016\u0000\u0000\u09df\u09e0\u0001\u0000\u0000\u0000"+ - "\u09e0\u09e1\u0006\u00d2\u0002\u0000\u09e1\u09e2\u0006\u00d2\r\u0000\u09e2"+ - "\u01af\u0001\u0000\u0000\u0000\u09e3\u09e4\t\u0000\u0000\u0000\u09e4\u09e5"+ - "\u0001\u0000\u0000\u0000\u09e5\u09e6\u0006\u00d3\u0002\u0000\u09e6\u01b1"+ - "\u0001\u0000\u0000\u0000\u09e7\u09e8\u0005\\\u0000\u0000\u09e8\u09e9\u0005"+ - "e\u0000\u0000\u09e9\u09ea\u0005n\u0000\u0000\u09ea\u09eb\u0005d\u0000"+ - "\u0000\u09eb\u09ec\u0005m\u0000\u0000\u09ec\u09ed\u0005o\u0000\u0000\u09ed"+ - "\u09ee\u0005d\u0000\u0000\u09ee\u09ef\u0005a\u0000\u0000\u09ef\u09f0\u0005"+ - "l\u0000\u0000\u09f0\u09f1\u0005i\u0000\u0000\u09f1\u09f2\u0005t\u0000"+ - "\u0000\u09f2\u09f3\u0005y\u0000\u0000\u09f3\u09f4\u0001\u0000\u0000\u0000"+ - "\u09f4\u09f5\u0006\u00d4\t\u0000\u09f5\u09f6\u0006\u00d4\n\u0000\u09f6"+ - "\u01b3\u0001\u0000\u0000\u0000\u09f7\u09f8\u0005\"\u0000\u0000\u09f8\u09f9"+ - "\u0001\u0000\u0000\u0000\u09f9\u09fa\u0006\u00d5\u0002\u0000\u09fa\u09fb"+ - "\u0006\u00d5\u000b\u0000\u09fb\u01b5\u0001\u0000\u0000\u0000\u09fc\u09fd"+ - "\u0005\'\u0000\u0000\u09fd\u09fe\u0001\u0000\u0000\u0000\u09fe\u09ff\u0006"+ - "\u00d6\u0002\u0000\u09ff\u0a00\u0006\u00d6\f\u0000\u0a00\u01b7\u0001\u0000"+ - "\u0000\u0000\u0a01\u0a02\u0007\u0015\u0000\u0000\u0a02\u0a03\u0007\u0016"+ - "\u0000\u0000\u0a03\u0a04\u0001\u0000\u0000\u0000\u0a04\u0a05\u0006\u00d7"+ - "\u0002\u0000\u0a05\u0a06\u0006\u00d7\r\u0000\u0a06\u01b9\u0001\u0000\u0000"+ - "\u0000\u0a07\u0a08\t\u0000\u0000\u0000\u0a08\u0a09\u0001\u0000\u0000\u0000"+ - "\u0a09\u0a0a\u0006\u00d8\u0002\u0000\u0a0a\u01bb\u0001\u0000\u0000\u0000"+ - "\u0a0b\u0a0c\u0005\\\u0000\u0000\u0a0c\u0a0d\u0005]\u0000\u0000\u0a0d"+ - "\u0a0e\u0001\u0000\u0000\u0000\u0a0e\u0a0f\u0006\u00d9\t\u0000\u0a0f\u0a10"+ - "\u0006\u00d9\n\u0000\u0a10\u01bd\u0001\u0000\u0000\u0000\u0a11\u0a12\u0005"+ - "\"\u0000\u0000\u0a12\u0a13\u0001\u0000\u0000\u0000\u0a13\u0a14\u0006\u00da"+ - "\u0002\u0000\u0a14\u0a15\u0006\u00da\u000b\u0000\u0a15\u01bf\u0001\u0000"+ - "\u0000\u0000\u0a16\u0a17\u0005\'\u0000\u0000\u0a17\u0a18\u0001\u0000\u0000"+ - "\u0000\u0a18\u0a19\u0006\u00db\u0002\u0000\u0a19\u0a1a\u0006\u00db\f\u0000"+ - "\u0a1a\u01c1\u0001\u0000\u0000\u0000\u0a1b\u0a1c\u0007\u0015\u0000\u0000"+ - "\u0a1c\u0a1d\u0007\u0016\u0000\u0000\u0a1d\u0a1e\u0001\u0000\u0000\u0000"+ - "\u0a1e\u0a1f\u0006\u00dc\u0002\u0000\u0a1f\u0a20\u0006\u00dc\r\u0000\u0a20"+ - "\u01c3\u0001\u0000\u0000\u0000\u0a21\u0a22\t\u0000\u0000\u0000\u0a22\u0a23"+ - "\u0001\u0000\u0000\u0000\u0a23\u0a24\u0006\u00dd\u0002\u0000\u0a24\u01c5"+ - "\u0001\u0000\u0000\u0000\u0a25\u0a26\u0005\\\u0000\u0000"; - private static final String _serializedATNSegment1 = - "\u0a26\u0a27\u0005]\u0000\u0000\u0a27\u0a28\u0005]\u0000\u0000\u0a28\u0a29"+ - "\u0001\u0000\u0000\u0000\u0a29\u0a2a\u0006\u00de\t\u0000\u0a2a\u0a2b\u0006"+ - "\u00de\n\u0000\u0a2b\u01c7\u0001\u0000\u0000\u0000\u0a2c\u0a2d\u0005\""+ - "\u0000\u0000\u0a2d\u0a2e\u0001\u0000\u0000\u0000\u0a2e\u0a2f\u0006\u00df"+ - "\u0002\u0000\u0a2f\u0a30\u0006\u00df\u000b\u0000\u0a30\u01c9\u0001\u0000"+ - "\u0000\u0000\u0a31\u0a32\u0005\'\u0000\u0000\u0a32\u0a33\u0001\u0000\u0000"+ - "\u0000\u0a33\u0a34\u0006\u00e0\u0002\u0000\u0a34\u0a35\u0006\u00e0\f\u0000"+ - "\u0a35\u01cb\u0001\u0000\u0000\u0000\u0a36\u0a37\u0007\u0015\u0000\u0000"+ - "\u0a37\u0a38\u0007\u0016\u0000\u0000\u0a38\u0a39\u0001\u0000\u0000\u0000"+ - "\u0a39\u0a3a\u0006\u00e1\u0002\u0000\u0a3a\u0a3b\u0006\u00e1\r\u0000\u0a3b"+ - "\u01cd\u0001\u0000\u0000\u0000\u0a3c\u0a3d\t\u0000\u0000\u0000\u0a3d\u0a3e"+ - "\u0001\u0000\u0000\u0000\u0a3e\u0a3f\u0006\u00e2\u0002\u0000\u0a3f\u01cf"+ - "\u0001\u0000\u0000\u0000\u0a40\u0a41\u0007\u0015\u0000\u0000\u0a41\u0a42"+ - "\u0005\"\u0000\u0000\u0a42\u0a43\u0001\u0000\u0000\u0000\u0a43\u0a44\u0006"+ - "\u00e3\u0002\u0000\u0a44\u01d1\u0001\u0000\u0000\u0000\u0a45\u0a46\u0005"+ - "\"\u0000\u0000\u0a46\u0a47\u0001\u0000\u0000\u0000\u0a47\u0a48\u0006\u00e4"+ - "\u0002\u0000\u0a48\u0a49\u0006\u00e4\n\u0000\u0a49\u01d3\u0001\u0000\u0000"+ - "\u0000\u0a4a\u0a4b\t\u0000\u0000\u0000\u0a4b\u0a4c\u0001\u0000\u0000\u0000"+ - "\u0a4c\u0a4d\u0006\u00e5\u0002\u0000\u0a4d\u01d5\u0001\u0000\u0000\u0000"+ - "\u0a4e\u0a4f\u0005\'\u0000\u0000\u0a4f\u0a50\u0001\u0000\u0000\u0000\u0a50"+ - "\u0a51\u0006\u00e6\u0002\u0000\u0a51\u0a52\u0006\u00e6\n\u0000\u0a52\u01d7"+ - "\u0001\u0000\u0000\u0000\u0a53\u0a54\t\u0000\u0000\u0000\u0a54\u0a55\u0001"+ - "\u0000\u0000\u0000\u0a55\u0a56\u0006\u00e7\u0002\u0000\u0a56\u01d9\u0001"+ - "\u0000\u0000\u0000\u0a57\u0a58\u0005*\u0000\u0000\u0a58\u0a5b\u0005/\u0000"+ - "\u0000\u0a59\u0a5b\u0005\u0000\u0000\u0001\u0a5a\u0a57\u0001\u0000\u0000"+ - "\u0000\u0a5a\u0a59\u0001\u0000\u0000\u0000\u0a5b\u0a5c\u0001\u0000\u0000"+ - "\u0000\u0a5c\u0a5d\u0006\u00e8\u0002\u0000\u0a5d\u0a5e\u0006\u00e8\n\u0000"+ - "\u0a5e\u01db\u0001\u0000\u0000\u0000\u0a5f\u0a60\t\u0000\u0000\u0000\u0a60"+ - "\u0a61\u0001\u0000\u0000\u0000\u0a61\u0a62\u0006\u00e9\u0002\u0000\u0a62"+ - "\u01dd\u0001\u0000\u0000\u0000\u0a63\u0a64\u0005*\u0000\u0000\u0a64\u0a67"+ - "\u0005/\u0000\u0000\u0a65\u0a67\u0005\u0000\u0000\u0001\u0a66\u0a63\u0001"+ - "\u0000\u0000\u0000\u0a66\u0a65\u0001\u0000\u0000\u0000\u0a67\u0a68\u0001"+ - "\u0000\u0000\u0000\u0a68\u0a69\u0006\u00ea\u0000\u0000\u0a69\u0a6a\u0006"+ - "\u00ea\n\u0000\u0a6a\u01df\u0001\u0000\u0000\u0000\u0a6b\u0a6c\t\u0000"+ - "\u0000\u0000\u0a6c\u0a6d\u0001\u0000\u0000\u0000\u0a6d\u0a6e\u0006\u00eb"+ - "\u0002\u0000\u0a6e\u01e1\u0001\u0000\u0000\u0000\u0a6f\u0a70\u0005*\u0000"+ - "\u0000\u0a70\u0a73\u0005/\u0000\u0000\u0a71\u0a73\u0005\u0000\u0000\u0001"+ - "\u0a72\u0a6f\u0001\u0000\u0000\u0000\u0a72\u0a71\u0001\u0000\u0000\u0000"+ - "\u0a73\u0a74\u0001\u0000\u0000\u0000\u0a74\u0a75\u0006\u00ec\u000e\u0000"+ - "\u0a75\u0a76\u0006\u00ec\n\u0000\u0a76\u01e3\u0001\u0000\u0000\u0000\u0a77"+ - "\u0a78\t\u0000\u0000\u0000\u0a78\u0a79\u0001\u0000\u0000\u0000\u0a79\u0a7a"+ - "\u0006\u00ed\u0002\u0000\u0a7a\u01e5\u0001\u0000\u0000\u00009\u0000\u0001"+ - "\u0002\u0003\u0004\u0005\u0006\u0007\b\t\u05b0\u05ba\u0843\u084a\u0850"+ - "\u0863\u086b\u0873\u0875\u087f\u0888\u0890\u0898\u089d\u08a5\u08a7\u08b0"+ - "\u08b2\u08bd\u08c1\u08d7\u08da\u08e0\u08e2\u08e5\u08eb\u08ef\u08f3\u08f7"+ - "\u08fe\u0902\u0907\u090c\u090e\u0911\u0915\u091a\u091f\u0925\u0928\u092b"+ - "\u0931\u0934\u0936\u0a5a\u0a66\u0a72\u000f\u0000\u0001\u0000\u0007\u00b7"+ - "\u0000\u0003\u0000\u0000\u0005\t\u0000\u0005\b\u0000\u0005\u0001\u0000"+ - "\u0005\u0003\u0000\u0005\u0004\u0000\u0005\u0002\u0000\u0007\u0001\u0000"+ - "\u0004\u0000\u0000\u0005\u0005\u0000\u0005\u0006\u0000\u0005\u0007\u0000"+ - "\u0007\u00be\u0000"; - public static final String _serializedATN = Utils.join( - new String[] { - _serializedATNSegment0, - _serializedATNSegment1 - }, - "" - ); - public static final ATN _ATN = - new ATNDeserializer().deserialize(_serializedATN.toCharArray()); - static { - _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; - for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { - _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); - } - } -} \ No newline at end of file From e5ae29a7202d689f9c724b41c775d144ddd7e04d Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Thu, 28 Dec 2023 01:00:48 +0100 Subject: [PATCH 59/66] after discussion: all datatypes are free --- key.core/src/main/antlr4/KeYParser.g4 | 3 ++- .../de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java | 2 +- .../uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/key.core/src/main/antlr4/KeYParser.g4 b/key.core/src/main/antlr4/KeYParser.g4 index 476e66d15d..2a2926ea01 100644 --- a/key.core/src/main/antlr4/KeYParser.g4 +++ b/key.core/src/main/antlr4/KeYParser.g4 @@ -241,7 +241,8 @@ datatype_decls: datatype_decl: doc=DOC_COMMENT? - FREE? + // weigl: all datatypes are free! + // FREE? name=simple_ident EQUALS datatype_constructor (OR datatype_constructor)* diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java index e65cd41cbf..2fb7a684a7 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java @@ -56,7 +56,7 @@ public Object visitDecls(KeYParser.DeclsContext ctx) { @Override public Object visitDatatype_decl(KeYParser.Datatype_declContext ctx) { - boolean freeAdt = ctx.FREE() != null; + //boolean freeAdt = ctx.FREE() != null; var name = ctx.name.getText(); var doc = ctx.DOC_COMMENT() != null ? ctx.DOC_COMMENT().getText() diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java index 67554a6048..1e0db688a5 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/FunctionPredicateBuilder.java @@ -49,6 +49,7 @@ public Object visitDecls(KeYParser.DeclsContext ctx) { @Override public Object visitDatatype_decl(KeYParser.Datatype_declContext ctx) { + // weigl: all datatypes are free ==> functions are unique! // boolean freeAdt = ctx.FREE() != null; var sort = sorts().lookup(ctx.name.getText()); for (KeYParser.Datatype_constructorContext constructorContext : ctx @@ -58,7 +59,7 @@ public Object visitDatatype_decl(KeYParser.Datatype_declContext ctx) { for (int i = 0; i < args.length; i++) { args[i] = accept(constructorContext.sortId(i)); } - Function function = new Function(name, sort, args); + Function function = new Function(name, sort, args, null, true, false); namespaces().functions().add(function); } return null; From 2e5d8095f48f7813a8a35e03f165729b1345f4c5 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Fri, 29 Dec 2023 18:01:12 +0100 Subject: [PATCH 60/66] spotless --- .../de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java index 2fb7a684a7..0f08d663af 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java +++ b/key.core/src/main/java/de/uka/ilkd/key/nparser/builder/DeclarationBuilder.java @@ -56,7 +56,7 @@ public Object visitDecls(KeYParser.DeclsContext ctx) { @Override public Object visitDatatype_decl(KeYParser.Datatype_declContext ctx) { - //boolean freeAdt = ctx.FREE() != null; + // boolean freeAdt = ctx.FREE() != null; var name = ctx.name.getText(); var doc = ctx.DOC_COMMENT() != null ? ctx.DOC_COMMENT().getText() From 06c37e98d96f8e1b6310f5b177c2909310662b71 Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Fri, 29 Dec 2023 18:32:58 +0100 Subject: [PATCH 61/66] automatical translate package.html to package-info.java It is recommended since Java 1.5 to use package-info.java. It also allows to set annotation for a whole package (in preparation for nullness checker). --- .../uka/ilkd/key/util/rifl/package-info.java | 8 ++ .../de/uka/ilkd/key/util/rifl/package.html | 17 --- .../key/java/abstraction/package-info.java | 19 +++ .../ilkd/key/java/abstraction/package.html | 27 ---- .../declaration/modifier/package-info.java | 6 + .../java/declaration/modifier/package.html | 14 -- .../key/java/declaration/package-info.java | 11 ++ .../ilkd/key/java/declaration/package.html | 19 --- .../java/expression/literal/package-info.java | 7 + .../key/java/expression/literal/package.html | 15 -- .../expression/operator/package-info.java | 7 + .../key/java/expression/operator/package.html | 15 -- .../key/java/expression/package-info.java | 6 + .../uka/ilkd/key/java/expression/package.html | 14 -- .../de/uka/ilkd/key/java/package-info.java | 103 +++++++++++++ .../java/de/uka/ilkd/key/java/package.html | 110 -------------- .../key/java/recoderext/adt/package-info.java | 5 + .../ilkd/key/java/recoderext/adt/package.html | 14 -- .../ilkd/key/java/reference/package-info.java | 5 + .../uka/ilkd/key/java/reference/package.html | 13 -- .../ilkd/key/java/statement/package-info.java | 6 + .../uka/ilkd/key/java/statement/package.html | 14 -- .../ilkd/key/java/visitor/package-info.java | 5 + .../de/uka/ilkd/key/java/visitor/package.html | 15 -- .../de/uka/ilkd/key/ldt/package-info.java | 7 + .../java/de/uka/ilkd/key/ldt/package.html | 13 -- .../uka/ilkd/key/logic/op/package-info.java | 20 +++ .../de/uka/ilkd/key/logic/op/package.html | 33 ----- .../de/uka/ilkd/key/logic/package-info.java | 34 +++++ .../java/de/uka/ilkd/key/logic/package.html | 40 ------ .../uka/ilkd/key/logic/sort/package-info.java | 10 ++ .../de/uka/ilkd/key/logic/sort/package.html | 20 --- .../java/de/uka/ilkd/key/pp/package-info.java | 5 + .../main/java/de/uka/ilkd/key/pp/package.html | 14 -- .../uka/ilkd/key/proof/init/package-info.java | 7 + .../de/uka/ilkd/key/proof/init/package.html | 16 --- .../uka/ilkd/key/proof/io/package-info.java | 4 + .../de/uka/ilkd/key/proof/io/package.html | 13 -- .../uka/ilkd/key/proof/mgt/package-info.java | 6 + .../de/uka/ilkd/key/proof/mgt/package.html | 15 -- .../de/uka/ilkd/key/proof/package-info.java | 5 + .../java/de/uka/ilkd/key/proof/package.html | 14 -- .../uka/ilkd/key/rule/inst/package-info.java | 5 + .../de/uka/ilkd/key/rule/inst/package.html | 15 -- .../metaconstruct/arith/package-info.java | 5 + .../key/rule/metaconstruct/arith/package.html | 15 -- .../key/rule/metaconstruct/package-info.java | 5 + .../ilkd/key/rule/metaconstruct/package.html | 15 -- .../de/uka/ilkd/key/rule/package-info.java | 10 ++ .../java/de/uka/ilkd/key/rule/package.html | 16 --- .../de/uka/ilkd/key/smt/package-info.java | 6 + .../java/de/uka/ilkd/key/smt/package.html | 12 -- .../uka/ilkd/key/speclang/package-info.java | 8 ++ .../de/uka/ilkd/key/speclang/package.html | 14 -- .../uka/ilkd/key/strategy/package-info.java | 4 + .../de/uka/ilkd/key/strategy/package.html | 10 -- .../de/uka/ilkd/key/util/package-info.java | 6 + .../java/de/uka/ilkd/key/util/package.html | 12 -- .../de/uka/ilkd/key/util/pp/package-info.java | 25 ++++ .../java/de/uka/ilkd/key/util/pp/package.html | 33 ----- .../key/gui/configuration/package-info.java | 4 + .../ilkd/key/gui/configuration/package.html | 13 -- .../de/uka/ilkd/key/gui/package-info.java | 4 + .../java/de/uka/ilkd/key/gui/package.html | 13 -- .../de/uka/ilkd/key/gui/smt/package-info.java | 4 + .../java/de/uka/ilkd/key/gui/smt/package.html | 13 -- .../recoder/abstraction/package-info.java | 18 +++ .../java/recoder/abstraction/package.html | 17 --- .../java/recoder/bytecode/package-info.java | 6 + .../main/java/recoder/bytecode/package.html | 5 - .../recoder/convenience/package-info.java | 12 ++ .../java/recoder/convenience/package.html | 12 -- .../main/java/recoder/io/package-info.java | 6 + recoder/src/main/java/recoder/io/package.html | 5 - .../declaration/modifier/package-info.java | 6 + .../java/declaration/modifier/package.html | 5 - .../java/declaration/package-info.java | 11 ++ .../recoder/java/declaration/package.html | 10 -- .../java/expression/literal/package-info.java | 7 + .../java/expression/literal/package.html | 6 - .../expression/operator/package-info.java | 7 + .../java/expression/operator/package.html | 6 - .../recoder/java/expression/package-info.java | 6 + .../java/recoder/java/expression/package.html | 5 - .../main/java/recoder/java/package-info.java | 135 ++++++++++++++++++ .../src/main/java/recoder/java/package.html | 134 ----------------- .../recoder/java/reference/package-info.java | 5 + .../java/recoder/java/reference/package.html | 4 - .../recoder/java/statement/package-info.java | 6 + .../java/recoder/java/statement/package.html | 5 - .../main/java/recoder/kit/package-info.java | 9 ++ .../src/main/java/recoder/kit/package.html | 8 -- .../recoder/kit/pattern/package-info.java | 10 ++ .../java/recoder/kit/pattern/package.html | 9 -- .../kit/transformation/package-info.java | 5 + .../recoder/kit/transformation/package.html | 4 - .../main/java/recoder/list/package-info.java | 43 ++++++ .../src/main/java/recoder/list/package.html | 43 ------ .../src/main/java/recoder/package-info.java | 17 +++ recoder/src/main/java/recoder/package.html | 16 --- .../java/recoder/parser/package-info.java | 6 + .../src/main/java/recoder/parser/package.html | 5 - .../java/recoder/service/package-info.java | 4 + .../main/java/recoder/service/package.html | 3 - .../main/java/recoder/util/package-info.java | 8 ++ .../src/main/java/recoder/util/package.html | 7 - .../transformations/util/package-info.java | 8 ++ .../src/transformations/util/package.html | 7 - 108 files changed, 707 insertions(+), 962 deletions(-) create mode 100644 key.core.rifl/src/main/java/de/uka/ilkd/key/util/rifl/package-info.java delete mode 100644 key.core.rifl/src/main/java/de/uka/ilkd/key/util/rifl/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/abstraction/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/abstraction/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/declaration/modifier/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/declaration/modifier/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/declaration/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/declaration/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/expression/literal/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/expression/literal/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/expression/operator/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/expression/operator/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/expression/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/expression/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/recoderext/adt/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/recoderext/adt/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/reference/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/reference/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/statement/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/statement/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/visitor/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/java/visitor/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/ldt/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/ldt/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/logic/op/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/logic/op/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/logic/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/logic/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/logic/sort/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/logic/sort/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/pp/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/pp/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/proof/init/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/proof/init/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/proof/io/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/proof/io/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/proof/mgt/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/proof/mgt/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/proof/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/proof/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/rule/inst/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/rule/inst/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/arith/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/arith/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/rule/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/rule/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/smt/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/smt/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/speclang/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/speclang/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/strategy/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/strategy/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/util/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/util/package.html create mode 100644 key.core/src/main/java/de/uka/ilkd/key/util/pp/package-info.java delete mode 100644 key.core/src/main/java/de/uka/ilkd/key/util/pp/package.html create mode 100644 key.ui/src/main/java/de/uka/ilkd/key/gui/configuration/package-info.java delete mode 100644 key.ui/src/main/java/de/uka/ilkd/key/gui/configuration/package.html create mode 100644 key.ui/src/main/java/de/uka/ilkd/key/gui/package-info.java delete mode 100644 key.ui/src/main/java/de/uka/ilkd/key/gui/package.html create mode 100644 key.ui/src/main/java/de/uka/ilkd/key/gui/smt/package-info.java delete mode 100644 key.ui/src/main/java/de/uka/ilkd/key/gui/smt/package.html create mode 100644 recoder/src/main/java/recoder/abstraction/package-info.java delete mode 100644 recoder/src/main/java/recoder/abstraction/package.html create mode 100644 recoder/src/main/java/recoder/bytecode/package-info.java delete mode 100644 recoder/src/main/java/recoder/bytecode/package.html create mode 100644 recoder/src/main/java/recoder/convenience/package-info.java delete mode 100644 recoder/src/main/java/recoder/convenience/package.html create mode 100644 recoder/src/main/java/recoder/io/package-info.java delete mode 100644 recoder/src/main/java/recoder/io/package.html create mode 100644 recoder/src/main/java/recoder/java/declaration/modifier/package-info.java delete mode 100644 recoder/src/main/java/recoder/java/declaration/modifier/package.html create mode 100644 recoder/src/main/java/recoder/java/declaration/package-info.java delete mode 100644 recoder/src/main/java/recoder/java/declaration/package.html create mode 100644 recoder/src/main/java/recoder/java/expression/literal/package-info.java delete mode 100644 recoder/src/main/java/recoder/java/expression/literal/package.html create mode 100644 recoder/src/main/java/recoder/java/expression/operator/package-info.java delete mode 100644 recoder/src/main/java/recoder/java/expression/operator/package.html create mode 100644 recoder/src/main/java/recoder/java/expression/package-info.java delete mode 100644 recoder/src/main/java/recoder/java/expression/package.html create mode 100644 recoder/src/main/java/recoder/java/package-info.java delete mode 100644 recoder/src/main/java/recoder/java/package.html create mode 100644 recoder/src/main/java/recoder/java/reference/package-info.java delete mode 100644 recoder/src/main/java/recoder/java/reference/package.html create mode 100644 recoder/src/main/java/recoder/java/statement/package-info.java delete mode 100644 recoder/src/main/java/recoder/java/statement/package.html create mode 100644 recoder/src/main/java/recoder/kit/package-info.java delete mode 100644 recoder/src/main/java/recoder/kit/package.html create mode 100644 recoder/src/main/java/recoder/kit/pattern/package-info.java delete mode 100644 recoder/src/main/java/recoder/kit/pattern/package.html create mode 100644 recoder/src/main/java/recoder/kit/transformation/package-info.java delete mode 100644 recoder/src/main/java/recoder/kit/transformation/package.html create mode 100644 recoder/src/main/java/recoder/list/package-info.java delete mode 100644 recoder/src/main/java/recoder/list/package.html create mode 100644 recoder/src/main/java/recoder/package-info.java delete mode 100644 recoder/src/main/java/recoder/package.html create mode 100644 recoder/src/main/java/recoder/parser/package-info.java delete mode 100644 recoder/src/main/java/recoder/parser/package.html create mode 100644 recoder/src/main/java/recoder/service/package-info.java delete mode 100644 recoder/src/main/java/recoder/service/package.html create mode 100644 recoder/src/main/java/recoder/util/package-info.java delete mode 100644 recoder/src/main/java/recoder/util/package.html create mode 100644 recoder/src/test/resources/java5/src/transformations/util/package-info.java delete mode 100644 recoder/src/test/resources/java5/src/transformations/util/package.html diff --git a/key.core.rifl/src/main/java/de/uka/ilkd/key/util/rifl/package-info.java b/key.core.rifl/src/main/java/de/uka/ilkd/key/util/rifl/package-info.java new file mode 100644 index 0000000000..7420b91e7b --- /dev/null +++ b/key.core.rifl/src/main/java/de/uka/ilkd/key/util/rifl/package-info.java @@ -0,0 +1,8 @@ +/** + * RIFL is short for "Requirements for Information Flow Language", + * a tool-indepentent specification language developed in the RS3 project. + * The RIFL/Java dialect is documented in XXX. + * This package contains a transformer from input RIFL files (XML) and + * original Java files to JML* annotated files. + */ +package de.uka.ilkd.key.util.rifl; \ No newline at end of file diff --git a/key.core.rifl/src/main/java/de/uka/ilkd/key/util/rifl/package.html b/key.core.rifl/src/main/java/de/uka/ilkd/key/util/rifl/package.html deleted file mode 100644 index 5e6d67f147..0000000000 --- a/key.core.rifl/src/main/java/de/uka/ilkd/key/util/rifl/package.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - -RIFL is short for "Requirements for Information Flow Language", -a tool-indepentent specification language developed in the RS3 project. -The RIFL/Java dialect is documented in XXX. -This package contains a transformer from input RIFL files (XML) and -original Java files to JML* annotated files. - - diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/abstraction/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/abstraction/package-info.java new file mode 100644 index 0000000000..a609749214 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/java/abstraction/package-info.java @@ -0,0 +1,19 @@ +/** + * This package contains the metamodel abstractions as used by the + * semantical services. The {@link recoder.abstraction.ProgramModelElement}s + * hide the origin of the information, be it from Java source code, + * Java byte code, or predefined lacking any syntactical representation. + *

+ * There are three implicitly defined entities - + * {@link recoder.abstraction.ArrayType}, + * {@link recoder.abstraction.DefaultConstructor}, and + * {@link recoder.abstraction.Package}, as well as the predefined + * types {@link recoder.abstraction.NullType} and the base class for + * the small number of {@link recoder.abstraction.PrimitiveType}s. + *

+ * {@link recoder.abstraction.Scope}s are attached to + * {@link recoder.abstraction.ScopeDefiningElement}s by + * {@link recoder.service.SourceInfo} implementations and should + * not be modified from others. + */ +package de.uka.ilkd.key.java.abstraction; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/abstraction/package.html b/key.core/src/main/java/de/uka/ilkd/key/java/abstraction/package.html deleted file mode 100644 index dbb6f1ed21..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/java/abstraction/package.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - -This package contains the meta model abstractions as used by the -semantical services. The {@link recoder.abstraction.ProgramModelElement}s -hide the origin of the information, be it from Java source code, -Java byte code, or predefined lacking any syntactical representation. -

-There are three implicitly defined entities - -{@link recoder.abstraction.ArrayType}, -{@link recoder.abstraction.DefaultConstructor}, and -{@link recoder.abstraction.Package}, as well as the predefined -types {@link recoder.abstraction.NullType} and the base class for -the small number of {@link recoder.abstraction.PrimitiveType}s. -

-{@link recoder.abstraction.Scope}s are attached to -{@link recoder.abstraction.ScopeDefiningElement}s by -{@link recoder.service.SourceInfo} implementations and should -not be modified from others. - diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/declaration/modifier/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/declaration/modifier/package-info.java new file mode 100644 index 0000000000..0d1cddbc5c --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/java/declaration/modifier/package-info.java @@ -0,0 +1,6 @@ +/** + * This package collects all Java modifiers. The sole abstraction beneath + * the parent {@link recoder.java.declaration.Modifier} is the + * {@link recoder.java.declaration.modifier.VisibilityModifier}. + */ +package de.uka.ilkd.key.java.declaration.modifier; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/declaration/modifier/package.html b/key.core/src/main/java/de/uka/ilkd/key/java/declaration/modifier/package.html deleted file mode 100644 index 2b53bd6c86..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/java/declaration/modifier/package.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - -This package collects all Java modifiers. The sole abstraction beneath -the parent {@link recoder.java.declaration.Modifier} is the -{@link recoder.java.declaration.modifier.VisibilityModifier}. - diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/declaration/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/declaration/package-info.java new file mode 100644 index 0000000000..d7764b669e --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/java/declaration/package-info.java @@ -0,0 +1,11 @@ +/** + * Elements of the Java syntax tree representing declarations. + * For each declaration, there exists a corresponding + * {@link recoder.java.Reference} in the {@link recoder.java.reference} + * package. + * Each {@link recoder.java.Declaration} + * provides some convenience methods that query the possible modifiers. + * The modifiers themselves are collected in the subpackage + * {@link recoder.java.declaration.modifier}. + */ +package de.uka.ilkd.key.java.declaration; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/declaration/package.html b/key.core/src/main/java/de/uka/ilkd/key/java/declaration/package.html deleted file mode 100644 index ce67e7abf0..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/java/declaration/package.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - -Elements of the Java syntax tree representing declarations. -For each declaration, there exists a corresponding -{@link recoder.java.Reference} in the {@link recoder.java.reference} -package. -Each {@link recoder.java.Declaration} -provides some convenience methods that query the possible modifiers. -The modifiers themselves are collected in the subpackage -{@link recoder.java.declaration.modifier}. - diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/expression/literal/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/expression/literal/package-info.java new file mode 100644 index 0000000000..1a2c375c96 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/java/expression/literal/package-info.java @@ -0,0 +1,7 @@ +/** + * This package contains representations for the various Java literal types. + * Quite special are the non-primitive + * {@link recoder.java.expression.literal.NullLiteral} and + * {@link recoder.java.expression.literal.StringLiteral}. + */ +package de.uka.ilkd.key.java.expression.literal; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/expression/literal/package.html b/key.core/src/main/java/de/uka/ilkd/key/java/expression/literal/package.html deleted file mode 100644 index fcba032dbd..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/java/expression/literal/package.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - -This package contains representations for the various Java literal types. -Quite special are the non-primitive -{@link recoder.java.expression.literal.NullLiteral} and -{@link recoder.java.expression.literal.StringLiteral}. - diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/expression/operator/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/expression/operator/package-info.java new file mode 100644 index 0000000000..583fd4cbc1 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/java/expression/operator/package-info.java @@ -0,0 +1,7 @@ +/** + * Elements of the Java syntax tree representing operators and operator-like + * expressions. + * {@link recoder.java.expression.operator.New} is also considered an + * operator ({@link recoder.java.expression.operator.TypeOperator}). + */ +package de.uka.ilkd.key.java.expression.operator; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/expression/operator/package.html b/key.core/src/main/java/de/uka/ilkd/key/java/expression/operator/package.html deleted file mode 100644 index bd58f308a0..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/java/expression/operator/package.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - -Elements of the Java syntax tree representing operators and operator-like -expressions. -{@link recoder.java.expression.operator.New} is also considered an -operator ({@link recoder.java.expression.operator.TypeOperator}). - diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/expression/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/expression/package-info.java new file mode 100644 index 0000000000..ee80e567e0 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/java/expression/package-info.java @@ -0,0 +1,6 @@ +/** + * Elements of the Java syntax tree representing expressions. + * The various operators and literals are bundled in the corresponding + * subpackages. + */ +package de.uka.ilkd.key.java.expression; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/expression/package.html b/key.core/src/main/java/de/uka/ilkd/key/java/expression/package.html deleted file mode 100644 index 0b1754d169..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/java/expression/package.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - -Elements of the Java syntax tree representing expressions. -The various operators and literals are bundled in the corresponding -subpackages. - diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/package-info.java new file mode 100644 index 0000000000..5ae7d044d7 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/java/package-info.java @@ -0,0 +1,103 @@ +/** + * This package contains classes that cover the Java programming language. + * The classes in the subpackages are mainly taken from the Recoder + * framework and made immutable. They are transformed into this data + * structure from a Recoder structure by {@link + * de.uka.ilkd.key.java.Recoder2KeY} or {@link + * de.uka.ilkd.key.SchemaRecoder2KeY}. However, in some details both + * data structures might differ more. + * The following explanations are adapted from the + * documentation of the Recoder framework. + *

+ *
Source and Program Elements
+ *
+ * A {@link de.uka.ilkd.key.java.SourceElement} is a syntactical entity and not + * necessary a {@link de.uka.ilkd.key.java.ModelElement}, such as a {@link de.uka.ilkd.key.java.Comment}. + *

+ * A {@link de.uka.ilkd.key.java.ProgramElement} is a {@link de.uka.ilkd.key.java.SourceElement} + * and a {@link de.uka.ilkd.key.ModelElement}. It is aware of its parent in the syntax + * tree, while a pure {@link de.uka.ilkd.key.java.SourceElement} is not considered as a + * member of the AST even though it is represented in the sources. + *

+ * {@link de.uka.ilkd.key.java.ProgramElement}s are further + * classified into {@link de.uka.ilkd.key.java.TerminalProgramElement}s and + * {@link de.uka.ilkd.key.java.NonTerminalProgramElement}s. While {@link de.uka.ilkd.key.java.TerminalProgramElement} + * is just a tag class, {@link de.uka.ilkd.key.java.NonTerminalProgramElement}s know + * their AST children (while it is possible that they do not have any). + * A complete source file occurs as a {@link de.uka.ilkd.key.java.CompilationUnit}. + *

+ * {@link de.uka.ilkd.key.java.JavaSourceElement} and + * {@link de.uka.ilkd.key.java.JavaProgramElement} are abstract classes defining + * standard implementations that already know their + * {@link de.uka.ilkd.key.java.JavaProgramFactory}. + *

+ *

+ *

Expressions and Statements
+ *
+ * {@link de.uka.ilkd.key.java.Expression} and {@link de.uka.ilkd.key.java.Statement} are + * self-explanatory. A {@link de.uka.ilkd.key.java.LoopInitializer} is a special + * {@link de.uka.ilkd.key.java.Statement} valid as initializer of + * {@link de.uka.ilkd.key.java.statement.For} loops. + * {@link de.uka.ilkd.key.java.LoopInitializer} is subtyped by + * {@link de.uka.ilkd.key.java.expression.ExpressionStatement} and + * {@link de.uka.ilkd.key.java.declaration.LocalVariableDeclaration}). + *

+ * Concrete classes and further abstractions are bundled in the + * {@link de.uka.ilkd.key.java.expression} and {@link de.uka.ilkd.key.java.statement} packages. + *

+ *

+ *

Syntax Tree Parents
+ *
+ * There are a couple of abstractions dealing with properties of being a + * parent node. + *

+ * These are {@link de.uka.ilkd.key.java.declaration.TypeDeclarationContainer}, + * {@link de.uka.ilkd.key.java.ExpressionContainer}, + * {@link de.uka.ilkd.key.java.StatementContainer}, + * {@link de.uka.ilkd.key.java.ParameterContainer}, + * {@link de.uka.ilkd.key.java.NamedProgramElement} and + * {@link de.uka.ilkd.key.java.reference.TypeReferenceContainer}. A + * An {@link de.uka.ilkd.key.java.ExpressionContainer} contains + * {@link de.uka.ilkd.key.java.Expression}s, a + * {@link de.uka.ilkd.key.java.StatementContainer} contains + * {@link de.uka.ilkd.key.java.Statement}s, a + * {@link de.uka.ilkd.key.java.ParameterContainer} + * (either a {@link de.uka.ilkd.key.java.declaration.MethodDeclaration} or a + * {@link de.uka.ilkd.key.java.statement.Catch} statement) contains + * {@link de.uka.ilkd.key.java.declaration.ParameterDeclaration}s. + * A {@link de.uka.ilkd.key.java.NamedProgramElement} is a subtype of + * {@link de.uka.ilkd.key.java.NamedModelElement}. + * A {@link de.uka.ilkd.key.java.reference.TypeReferenceContainer} contains one or + * several names, but these are names of types that are referred to explicitely + * by a {@link de.uka.ilkd.key.java.reference.TypeReference}. + *

+ *

+ *

References
+ *
+ * A {@link de.uka.ilkd.key.java.Reference} is an explicite use of an entity. Most of + * these {@link de.uka.ilkd.key.java.Reference}s are + * {@link de.uka.ilkd.key.java.reference.NameReference}s + * and as such {@link de.uka.ilkd.key.java.NamedProgramElement}s, e.g. the + * {@link de.uka.ilkd.key.java.reference.TypeReference}. + * Subtypes of {@link de.uka.ilkd.key.java.Reference}s are bundled in the + * {@link de.uka.ilkd.key.java.reference} package. + *
+ *

+ *

Modifiers and Declarations
+ *
+ * {@link de.uka.ilkd.key.java.declaration.Modifier}s are (exclusively) used in the + * context of {@link de.uka.ilkd.key.java.Declaration}s. + * {@link de.uka.ilkd.key.java.declaration.Modifier}s occur explicitly, since they occur + * as syntactical tokens that might be indented and commented. + * {@link de.uka.ilkd.key.java.Declaration}s are either + * declarations of types or other entities such as + * {@link de.uka.ilkd.key.java.declaration.MemberDeclaration} or + * {@link de.uka.ilkd.key.java.declaration.VariableDeclaration}. Concrete + * {@link de.uka.ilkd.key.java.declaration.Modifier}s and + * {@link de.uka.ilkd.key.java.Declaration}s are + * bundled in the {@link de.uka.ilkd.key.java.declaration.modifier} and + * {@link de.uka.ilkd.key.java.declaration} packages. + *
+ *
+ */ +package de.uka.ilkd.key.java; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/package.html b/key.core/src/main/java/de/uka/ilkd/key/java/package.html deleted file mode 100644 index 521efb59ac..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/java/package.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - -This package contains classes that cover the Java programming language. - -The classes in the subpackages are mainly taken from the Recoder - framework and made immutable. They are transformed into this data - structure from a Recoder structure by {@link - de.uka.ilkd.key.java.Recoder2KeY} or {@link - de.uka.ilkd.key.SchemaRecoder2KeY}. However, in some details both - data structures might differ more. - -The following explanations are adapted from the - documentation of the Recoder framework. -
-
Source and Program Elements
-
-A {@link de.uka.ilkd.key.java.SourceElement} is a syntactical entity and not -necessary a {@link de.uka.ilkd.key.java.ModelElement}, such as a {@link de.uka.ilkd.key.java.Comment}. -

-A {@link de.uka.ilkd.key.java.ProgramElement} is a {@link de.uka.ilkd.key.java.SourceElement} -and a {@link de.uka.ilkd.key.ModelElement}. It is aware of its parent in the syntax -tree, while a pure {@link de.uka.ilkd.key.java.SourceElement} is not considered as a -member of the AST even though it is represented in the sources. -

-{@link de.uka.ilkd.key.java.ProgramElement}s are further -classified into {@link de.uka.ilkd.key.java.TerminalProgramElement}s and -{@link de.uka.ilkd.key.java.NonTerminalProgramElement}s. While {@link de.uka.ilkd.key.java.TerminalProgramElement} -is just a tag class, {@link de.uka.ilkd.key.java.NonTerminalProgramElement}s know -their AST children (while it is possible that they do not have any). -A complete source file occurs as a {@link de.uka.ilkd.key.java.CompilationUnit}. -

-{@link de.uka.ilkd.key.java.JavaSourceElement} and -{@link de.uka.ilkd.key.java.JavaProgramElement} are abstract classes defining -standard implementations that already know their -{@link de.uka.ilkd.key.java.JavaProgramFactory}. -

-

-

Expressions and Statements
-
-{@link de.uka.ilkd.key.java.Expression} and {@link de.uka.ilkd.key.java.Statement} are -self-explanatory. A {@link de.uka.ilkd.key.java.LoopInitializer} is a special -{@link de.uka.ilkd.key.java.Statement} valid as initializer of -{@link de.uka.ilkd.key.java.statement.For} loops. -{@link de.uka.ilkd.key.java.LoopInitializer} is subtyped by -{@link de.uka.ilkd.key.java.expression.ExpressionStatement} and -{@link de.uka.ilkd.key.java.declaration.LocalVariableDeclaration}). -

-Concrete classes and further abstractions are bundled in the -{@link de.uka.ilkd.key.java.expression} and {@link de.uka.ilkd.key.java.statement} packages. -

-

-

Syntax Tree Parents
-
-There are a couple of abstractions dealing with properties of being a -parent node. -

-These are {@link de.uka.ilkd.key.java.declaration.TypeDeclarationContainer}, -{@link de.uka.ilkd.key.java.ExpressionContainer}, -{@link de.uka.ilkd.key.java.StatementContainer}, -{@link de.uka.ilkd.key.java.ParameterContainer}, -{@link de.uka.ilkd.key.java.NamedProgramElement} and -{@link de.uka.ilkd.key.java.reference.TypeReferenceContainer}. A -An {@link de.uka.ilkd.key.java.ExpressionContainer} contains -{@link de.uka.ilkd.key.java.Expression}s, a -{@link de.uka.ilkd.key.java.StatementContainer} contains -{@link de.uka.ilkd.key.java.Statement}s, a -{@link de.uka.ilkd.key.java.ParameterContainer} -(either a {@link de.uka.ilkd.key.java.declaration.MethodDeclaration} or a -{@link de.uka.ilkd.key.java.statement.Catch} statement) contains -{@link de.uka.ilkd.key.java.declaration.ParameterDeclaration}s. -A {@link de.uka.ilkd.key.java.NamedProgramElement} is a subtype of -{@link de.uka.ilkd.key.java.NamedModelElement}. -A {@link de.uka.ilkd.key.java.reference.TypeReferenceContainer} contains one or -several names, but these are names of types that are referred to explicitely -by a {@link de.uka.ilkd.key.java.reference.TypeReference}. -

-

-

References
-
-A {@link de.uka.ilkd.key.java.Reference} is an explicite use of an entity. Most of -these {@link de.uka.ilkd.key.java.Reference}s are -{@link de.uka.ilkd.key.java.reference.NameReference}s -and as such {@link de.uka.ilkd.key.java.NamedProgramElement}s, e.g. the -{@link de.uka.ilkd.key.java.reference.TypeReference}. -Subtypes of {@link de.uka.ilkd.key.java.Reference}s are bundled in the -{@link de.uka.ilkd.key.java.reference} package. -
-

-

Modifiers and Declarations
-
-{@link de.uka.ilkd.key.java.declaration.Modifier}s are (exclusively) used in the -context of {@link de.uka.ilkd.key.java.Declaration}s. -{@link de.uka.ilkd.key.java.declaration.Modifier}s occur explicitly, since they occur -as syntactical tokens that might be indented and commented. -{@link de.uka.ilkd.key.java.Declaration}s are either -declarations of types or other entities such as -{@link de.uka.ilkd.key.java.declaration.MemberDeclaration} or -{@link de.uka.ilkd.key.java.declaration.VariableDeclaration}. Concrete -{@link de.uka.ilkd.key.java.declaration.Modifier}s and -{@link de.uka.ilkd.key.java.Declaration}s are -bundled in the {@link de.uka.ilkd.key.java.declaration.modifier} and -{@link de.uka.ilkd.key.java.declaration} packages. -
-
- diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/recoderext/adt/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/recoderext/adt/package-info.java new file mode 100644 index 0000000000..2a28f741f1 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/java/recoderext/adt/package-info.java @@ -0,0 +1,5 @@ +/** + * This package contains RecodeR Operators + * which represent algebraic data type functions. (See also the ldt package description.) + */ +package de.uka.ilkd.key.java.recoderext.adt; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/recoderext/adt/package.html b/key.core/src/main/java/de/uka/ilkd/key/java/recoderext/adt/package.html deleted file mode 100644 index e969bb108b..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/java/recoderext/adt/package.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - -This package contains RecodeR Operators -which represent algebraic data type functions. (See also the ldt package description.) - - \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/reference/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/reference/package-info.java new file mode 100644 index 0000000000..3d8cb9af65 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/java/reference/package-info.java @@ -0,0 +1,5 @@ +/** + * Elements of the Java syntax tree representing implicit or explicit (named) + * references to other program elements. + */ +package de.uka.ilkd.key.java.reference; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/reference/package.html b/key.core/src/main/java/de/uka/ilkd/key/java/reference/package.html deleted file mode 100644 index 5af2300c18..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/java/reference/package.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - -Elements of the Java syntax tree representing implicit or explicit (named) -references to other program elements. - diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/statement/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/statement/package-info.java new file mode 100644 index 0000000000..673dd6ba5e --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/java/statement/package-info.java @@ -0,0 +1,6 @@ +/** + * Elements of the Java syntax tree representing pure statements. + * Besides these other valid statements are the various expressions with + * side effects ({@link recoder.java.expression.ExpressionStatement}s). + */ +package de.uka.ilkd.key.java.statement; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/statement/package.html b/key.core/src/main/java/de/uka/ilkd/key/java/statement/package.html deleted file mode 100644 index 86b77166ec..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/java/statement/package.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - -Elements of the Java syntax tree representing pure statements. -Besides these other valid statements are the various expressions with -side effects ({@link recoder.java.expression.ExpressionStatement}s). - diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/visitor/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/visitor/package-info.java new file mode 100644 index 0000000000..40c024d906 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/java/visitor/package-info.java @@ -0,0 +1,5 @@ +/** + * contains classes representing visitors traversing the tree + * structure of Java programs. + */ +package de.uka.ilkd.key.java.visitor; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/visitor/package.html b/key.core/src/main/java/de/uka/ilkd/key/java/visitor/package.html deleted file mode 100644 index c5ff243d38..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/java/visitor/package.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - contains classes representing visitors traversing the tree - structure of Java programs. - - -Last modified: Tue Nov 26 08:54:55 MET 2002 - - - diff --git a/key.core/src/main/java/de/uka/ilkd/key/ldt/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/ldt/package-info.java new file mode 100644 index 0000000000..c009262e6c --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/ldt/package-info.java @@ -0,0 +1,7 @@ +/** + * This package contains the "language data types" (LDTs) of KeY. LDTs + * correspond to standard rule files shipped with KeY, and provide a + * programming interface to access the entities declared in these + * rule files. + */ +package de.uka.ilkd.key.ldt; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/ldt/package.html b/key.core/src/main/java/de/uka/ilkd/key/ldt/package.html deleted file mode 100644 index fd05c2ef99..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/ldt/package.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - This package contains the "language data types" (LDTs) of KeY. LDTs - correspond to standard rule files shipped with KeY, and provide a - programming interface to access the entities declared in these - rule files. - - diff --git a/key.core/src/main/java/de/uka/ilkd/key/logic/op/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/logic/op/package-info.java new file mode 100644 index 0000000000..2d10005e5e --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/logic/op/package-info.java @@ -0,0 +1,20 @@ +/** + * contains the operators of {@link + * de.uka.ilkd.key.logic.Term}s. Operators may be {@link + * de.uka.ilkd.key.logic.op.Quantifier}s or {@link + * de.uka.ilkd.key.logic.op.SubstOp}s that bind variables for + * subterms, but also {@link de.uka.ilkd.key.logic.op.Modality}s, or + * {@link de.uka.ilkd.key.logic.op.QuanUpdateOperator}s. Many of the operators + * are constantly defined in {@link de.uka.ilkd.key.logic.op.Op}s. + * An operator can be a {@link de.uka.ilkd.key.logic.op.TermSymbol}s, + * such as a {@link de.uka.ilkd.key.logic.op.Function} or a + * variable. There are several kind of variables: {@link + * de.uka.ilkd.key.logic.op.LogicVariable}s (variables that must be + * bound but do not occur in programs), {@link + * de.uka.ilkd.key.logic.op.ProgramVariable}s (allowed both in + * programs and in logic, but not boundable), {@link + * de.uka.ilkd.key.logic.op.Metavariable}s, and {@link + * de.uka.ilkd.key.logic.op.SchemaVariable}s for {@link + * de.uka.ilkd.key.rule.Taclet}s. + */ +package de.uka.ilkd.key.logic.op; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/logic/op/package.html b/key.core/src/main/java/de/uka/ilkd/key/logic/op/package.html deleted file mode 100644 index a20b86843e..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/logic/op/package.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - contains the operators of {@link - de.uka.ilkd.key.logic.Term}s. Operators may be {@link - de.uka.ilkd.key.logic.op.Quantifier}s or {@link - de.uka.ilkd.key.logic.op.SubstOp}s that bind variables for - subterms, but also {@link de.uka.ilkd.key.logic.op.Modality}s, or - {@link de.uka.ilkd.key.logic.op.QuanUpdateOperator}s. Many of the operators - are constantly defined in {@link de.uka.ilkd.key.logic.op.Op}s. - - An operator can be a {@link de.uka.ilkd.key.logic.op.TermSymbol}s, - such as a {@link de.uka.ilkd.key.logic.op.Function} or a - variable. There are several kind of variables: {@link - de.uka.ilkd.key.logic.op.LogicVariable}s (variables that must be - bound but do not occur in programs), {@link - de.uka.ilkd.key.logic.op.ProgramVariable}s (allowed both in - programs and in logic, but not boundable), {@link - de.uka.ilkd.key.logic.op.Metavariable}s, and {@link - de.uka.ilkd.key.logic.op.SchemaVariable}s for {@link - de.uka.ilkd.key.rule.Taclet}s. - - - - -Last modified: Mon Apr 18 09:42:36 MEST 2005 - - - diff --git a/key.core/src/main/java/de/uka/ilkd/key/logic/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/logic/package-info.java new file mode 100644 index 0000000000..b0ab26c0d3 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/logic/package-info.java @@ -0,0 +1,34 @@ +/** + *

provides a representation for the term and sequent + * structure. The structure of a term is defined in {@link + * de.uka.ilkd.key.logic.Term}. Subclasses of {@link + * de.uka.ilkd.key.logic.Term} provide representations for special + * kinds of terms. However, these subclasses are supposed to be not + * directly accessed. Instead, {@link de.uka.ilkd.key.logic.Term} + * provides methods for all the methods of the + * subclasses. Moreover, {@link de.uka.ilkd.key.logic.Term}s (or + * their subclasses) are supposed to be never constructed by + * constructors of their own, but by instances of {@link + * de.uka.ilkd.key.logic.TermFactory}.

+ *

The function of {@link de.uka.ilkd.key.logic.Term}s (e.g., if + * they represent a conjunction of subterms, a quantified + * formula,...) is only determined by an {@link + * de.uka.ilkd.key.logic.op.Operator} that is assigned to a {@link + * de.uka.ilkd.key.logic.Term} when the {@link + * de.uka.ilkd.key.logic.Term} is constructed.

+ *

{@link de.uka.ilkd.key.logic.Sequent}s consist of two {@link + * de.uka.ilkd.key.logic.Semisequent}s which represent a + * duplicate-free list of a {@link + * de.uka.ilkd.key.logic.SequentFormula}s. The latter consist of + * a {@link de.uka.ilkd.key.logic.Constraint} and a {@link + * de.uka.ilkd.key.logic.Term} of a special sort {@link + * de.uka.ilkd.key.logic.sort.Sort#FORMULA}.

+ *

{@link de.uka.ilkd.key.logic.Sequent}s and {@link + * de.uka.ilkd.key.logic.Term}s are immutable. + *

+ * + * + * Last modified: Wed Dec 4 15:11:14 MET 2002 + * + */ +package de.uka.ilkd.key.logic; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/logic/package.html b/key.core/src/main/java/de/uka/ilkd/key/logic/package.html deleted file mode 100644 index 9e3c6a8d23..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/logic/package.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - -

provides a representation for the term and sequent - structure. The structure of a term is defined in {@link - de.uka.ilkd.key.logic.Term}. Subclasses of {@link - de.uka.ilkd.key.logic.Term} provide representations for special - kinds of terms. However, these subclasses are supposed to be not - directly accessed. Instead, {@link de.uka.ilkd.key.logic.Term} - provides methods for all the methods of the - subclasses. Moreover, {@link de.uka.ilkd.key.logic.Term}s (or - their subclasses) are supposed to be never constructed by - constructors of their own, but by instances of {@link - de.uka.ilkd.key.logic.TermFactory}.

-

The function of {@link de.uka.ilkd.key.logic.Term}s (e.g., if - they represent a conjunction of subterms, a quantified - formula,...) is only determined by an {@link - de.uka.ilkd.key.logic.op.Operator} that is assigned to a {@link - de.uka.ilkd.key.logic.Term} when the {@link - de.uka.ilkd.key.logic.Term} is constructed.

-

{@link de.uka.ilkd.key.logic.Sequent}s consist of two {@link - de.uka.ilkd.key.logic.Semisequent}s which represent a - duplicate-free list of a {@link - de.uka.ilkd.key.logic.SequentFormula}s. The latter consist of - a {@link de.uka.ilkd.key.logic.Constraint} and a {@link - de.uka.ilkd.key.logic.Term} of a special sort {@link - de.uka.ilkd.key.logic.sort.Sort#FORMULA}.

-

{@link de.uka.ilkd.key.logic.Sequent}s and {@link - de.uka.ilkd.key.logic.Term}s are immutable. - - - -Last modified: Wed Dec 4 15:11:14 MET 2002 - - - diff --git a/key.core/src/main/java/de/uka/ilkd/key/logic/sort/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/logic/sort/package-info.java new file mode 100644 index 0000000000..5511d09c41 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/logic/sort/package-info.java @@ -0,0 +1,10 @@ +/** + * This package contains different kinds and implementations subtyping interface Sort. + * Each logic term has an assigned a sort. In order to support special concepts like + * arrays, objects, primitive types, it is useful to support different kinds of sorts. + * This allows to distinguish diffent categories of terms by looking on the sort type + * rather than on the name. + * In KeY we distinguish formulas from terms by the special sort instance + * Sort.Formula. + */ +package de.uka.ilkd.key.logic.sort; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/logic/sort/package.html b/key.core/src/main/java/de/uka/ilkd/key/logic/sort/package.html deleted file mode 100644 index ed74b17e3c..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/logic/sort/package.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - This package contains different kinds and implementations subtyping interface Sort. - Each logic term has an assigned a sort. In order to support special concepts like - arrays, objects, primitive types, it is useful to support different kinds of sorts. - This allows to distinguish diffent categories of terms by looking on the sort type - rather than on the name. - In KeY we distinguish formulas from terms by the special sort instance - Sort.Formula. - - -Last modified: Tue Nov 26 08:54:55 MET 2002 - - - diff --git a/key.core/src/main/java/de/uka/ilkd/key/pp/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/pp/package-info.java new file mode 100644 index 0000000000..8cd2b762bb --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/pp/package-info.java @@ -0,0 +1,5 @@ +/** + * This package contains pretty-printing functionality used by the GUI and for + * saving proofs. + */ +package de.uka.ilkd.key.pp; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/pp/package.html b/key.core/src/main/java/de/uka/ilkd/key/pp/package.html deleted file mode 100644 index 6d5ceeabe8..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/pp/package.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - -This package contains pretty-printing functionality used by the GUI and for -saving proofs. - - \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/proof/init/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/proof/init/package-info.java new file mode 100644 index 0000000000..414abffbb7 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/proof/init/package-info.java @@ -0,0 +1,7 @@ +/** + * This package contains classes handling prover initialisation. ProblemInitializer + * is the main class that drives the initialisation process. Core interfaces are + * EnvInput (provides a proof environment) and ProofOblInput (provides one or many + * sequents whose validity is to be proven). + */ +package de.uka.ilkd.key.proof.init; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/proof/init/package.html b/key.core/src/main/java/de/uka/ilkd/key/proof/init/package.html deleted file mode 100644 index 181598226d..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/proof/init/package.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - -This package contains classes handling prover initialisation. ProblemInitializer -is the main class that drives the initialisation process. Core interfaces are -EnvInput (provides a proof environment) and ProofOblInput (provides one or many -sequents whose validity is to be proven). - - \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/proof/io/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/proof/io/package-info.java new file mode 100644 index 0000000000..1276060d13 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/proof/io/package-info.java @@ -0,0 +1,4 @@ +/** + * Classes related to loading and saving proof files. + */ +package de.uka.ilkd.key.proof.io; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/proof/io/package.html b/key.core/src/main/java/de/uka/ilkd/key/proof/io/package.html deleted file mode 100644 index 4e2e773ca2..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/proof/io/package.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - -Classes related to loading and saving proof files. - - \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/proof/mgt/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/proof/mgt/package-info.java new file mode 100644 index 0000000000..94a92e3a21 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/proof/mgt/package-info.java @@ -0,0 +1,6 @@ +/** + * This package contains classes for proof environments and proof management. For + * example, proof management ensures that contract applications cannot lead to + * unsound cyclic dependencies between proofs. + */ +package de.uka.ilkd.key.proof.mgt; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/proof/mgt/package.html b/key.core/src/main/java/de/uka/ilkd/key/proof/mgt/package.html deleted file mode 100644 index 34cebdc1c0..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/proof/mgt/package.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - -This package contains classes for proof environments and proof management. For -example, proof management ensures that contract applications cannot lead to -unsound cyclic dependencies between proofs. - - \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/proof/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/proof/package-info.java new file mode 100644 index 0000000000..bbcf3c62f5 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/proof/package-info.java @@ -0,0 +1,5 @@ +/** + * This package contains the core data structures of proofs, nodes, goals, as well + * as machinery to deal with these data structures. + */ +package de.uka.ilkd.key.proof; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/proof/package.html b/key.core/src/main/java/de/uka/ilkd/key/proof/package.html deleted file mode 100644 index 47d0dc8136..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/proof/package.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - -This package contains the core data structures of proofs, nodes, goals, as well -as machinery to deal with these data structures. - - \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/rule/inst/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/rule/inst/package-info.java new file mode 100644 index 0000000000..1a0ec2117a --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/rule/inst/package-info.java @@ -0,0 +1,5 @@ +/** + * contains classes for the instantiation of schema variables of {@link + * de.uka.ilkd.key.rule.Taclet}s. + */ +package de.uka.ilkd.key.rule.inst; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/rule/inst/package.html b/key.core/src/main/java/de/uka/ilkd/key/rule/inst/package.html deleted file mode 100644 index ef0bb0021d..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/rule/inst/package.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - contains classes for the instantiation of schema variables of {@link - de.uka.ilkd.key.rule.Taclet}s. - - -Last modified: Tue Nov 26 08:54:55 MET 2002 - - - diff --git a/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/arith/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/arith/package-info.java new file mode 100644 index 0000000000..a13bae15f8 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/arith/package-info.java @@ -0,0 +1,5 @@ +/** + * contains classes representing the special meta constructs of {@link + * de.uka.ilkd.key.rule.Taclet}s performing arithmetic operations. + */ +package de.uka.ilkd.key.rule.metaconstruct.arith; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/arith/package.html b/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/arith/package.html deleted file mode 100644 index fb3af1a963..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/arith/package.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - contains classes representing the special meta constructs of {@link - de.uka.ilkd.key.rule.Taclet}s performing arithmetic operations. - - -Last modified: Tue Nov 26 08:54:55 MET 2002 - - - diff --git a/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/package-info.java new file mode 100644 index 0000000000..753f96f9e5 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/package-info.java @@ -0,0 +1,5 @@ +/** + * contains classes representing the meta constructs of {@link + * de.uka.ilkd.key.rule.Taclet}s. + */ +package de.uka.ilkd.key.rule.metaconstruct; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/package.html b/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/package.html deleted file mode 100644 index e78443a483..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/package.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - contains classes representing the meta constructs of {@link - de.uka.ilkd.key.rule.Taclet}s. - - -Last modified: Tue Nov 26 08:54:55 MET 2002 - - - diff --git a/key.core/src/main/java/de/uka/ilkd/key/rule/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/rule/package-info.java new file mode 100644 index 0000000000..6e7df2eb20 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/rule/package-info.java @@ -0,0 +1,10 @@ +/** + * This package contains classes for implementing rules. Most rules are + * taclet rules, represented by {@link + * de.uka.ilkd.key.rule.Taclet}. The package includes the + * representation of applications of taclets ({@link + * de.uka.ilkd.key.rule.TacletApp}) and the builders of taclets ({@link + * de.uka.ilkd.key.rule.TacletBuilder}). Besides taclets, there are + * built-in rules implemented directly in Java. + */ +package de.uka.ilkd.key.rule; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/rule/package.html b/key.core/src/main/java/de/uka/ilkd/key/rule/package.html deleted file mode 100644 index c5626c58d3..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/rule/package.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - This package contains classes for implementing rules. Most rules are - taclet rules, represented by {@link - de.uka.ilkd.key.rule.Taclet}. The package includes the - representation of applications of taclets ({@link - de.uka.ilkd.key.rule.TacletApp}) and the builders of taclets ({@link - de.uka.ilkd.key.rule.TacletBuilder}). Besides taclets, there are - built-in rules implemented directly in Java. - - diff --git a/key.core/src/main/java/de/uka/ilkd/key/smt/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/smt/package-info.java new file mode 100644 index 0000000000..5d7738b7b0 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/smt/package-info.java @@ -0,0 +1,6 @@ +/** + * This package contains the SMT backend of KeY, allowing to translate KeY formulas + * to formulas in formats such as SMT-LIB, and allowing to send such formulas to + * SMT solvers such as Simplify or Z3. + */ +package de.uka.ilkd.key.smt; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/smt/package.html b/key.core/src/main/java/de/uka/ilkd/key/smt/package.html deleted file mode 100644 index c6bf0fce73..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/smt/package.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - This package contains the SMT backend of KeY, allowing to translate KeY formulas - to formulas in formats such as SMT-LIB, and allowing to send such formulas to - SMT solvers such as Simplify or Z3. - - diff --git a/key.core/src/main/java/de/uka/ilkd/key/speclang/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/speclang/package-info.java new file mode 100644 index 0000000000..86674f8701 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/speclang/package-info.java @@ -0,0 +1,8 @@ +/** + * This package contains the specification language frontends of KeY. The task + * of the individual frontends (locates in subpackages such as "jml"), is to + * create objects of the types declared in this package. Core types are Contract, + * OperationContract, and DependencyContract. These are used as input by the + * proof obligations declared in package proof.init. + */ +package de.uka.ilkd.key.speclang; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/speclang/package.html b/key.core/src/main/java/de/uka/ilkd/key/speclang/package.html deleted file mode 100644 index 2e215ba8f3..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/speclang/package.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - This package contains the specification language frontends of KeY. The task - of the individual frontends (locates in subpackages such as "jml"), is to - create objects of the types declared in this package. Core types are Contract, - OperationContract, and DependencyContract. These are used as input by the - proof obligations declared in package proof.init. - - diff --git a/key.core/src/main/java/de/uka/ilkd/key/strategy/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/strategy/package-info.java new file mode 100644 index 0000000000..93c5d20544 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/strategy/package-info.java @@ -0,0 +1,4 @@ +/** + * This package contains classes implementing the proof search strategies of KeY. + */ +package de.uka.ilkd.key.strategy; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/strategy/package.html b/key.core/src/main/java/de/uka/ilkd/key/strategy/package.html deleted file mode 100644 index 3c3bf47bff..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/strategy/package.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - This package contains classes implementing the proof search strategies of KeY. - - diff --git a/key.core/src/main/java/de/uka/ilkd/key/util/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/util/package-info.java new file mode 100644 index 0000000000..6ca9c1ca0a --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/util/package-info.java @@ -0,0 +1,6 @@ +/** + * This package is a grab bag of miscellaneous useful code fragments. It also contains + * side functionalities like the installer (subpackage install), and the tool for + * removing generics from a Java program (subpackage removegenerics). + */ +package de.uka.ilkd.key.util; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/util/package.html b/key.core/src/main/java/de/uka/ilkd/key/util/package.html deleted file mode 100644 index 910f9a59c9..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/util/package.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - This package is a grab bag of miscellaneous useful code fragments. It also contains - side functionalities like the installer (subpackage install), and the tool for - removing generics from a Java program (subpackage removegenerics). - - diff --git a/key.core/src/main/java/de/uka/ilkd/key/util/pp/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/util/pp/package-info.java new file mode 100644 index 0000000000..ac45015848 --- /dev/null +++ b/key.core/src/main/java/de/uka/ilkd/key/util/pp/package-info.java @@ -0,0 +1,25 @@ +/** + * A package to pretty-print information using line breaks and + * indentation. For instance, it can be used to print + *

+ * while (i>0) {
+ * i--;
+ * j++;
+ * }
+ * 
+ * instead of + *
+ * while (i>0) { i
+ * --; j++;}
+ * 
+ * if a maximum line width of 15 characters is chosen. The frontend + * to the Pretty-Printer is the {@link + * de.uka.ilkd.key.util.pp.Layouter} class. You may configure what + * happens with the output by implemenenting the {@link + * de.uka.ilkd.key.util.pp.Backend} interface, or by using the + * standard implementation {@link + * de.uka.ilkd.key.util.pp.StringBackend}. + * + * @author Martin Giese + */ +package de.uka.ilkd.key.util.pp; \ No newline at end of file diff --git a/key.core/src/main/java/de/uka/ilkd/key/util/pp/package.html b/key.core/src/main/java/de/uka/ilkd/key/util/pp/package.html deleted file mode 100644 index 50cd4017f9..0000000000 --- a/key.core/src/main/java/de/uka/ilkd/key/util/pp/package.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - A package to pretty-print information using line breaks and - indentation. For instance, it can be used to print -
-    while (i>0) {
-      i--;
-      j++;
-    }
-    
- instead of -
-    while (i>0) { i
-    --; j++;}
-    
- if a maximum line width of 15 characters is chosen. The frontend - to the Pretty-Printer is the {@link - de.uka.ilkd.key.util.pp.Layouter} class. You may configure what - happens with the output by implemenenting the {@link - de.uka.ilkd.key.util.pp.Backend} interface, or by using the - standard implementation {@link - de.uka.ilkd.key.util.pp.StringBackend}. - - @author Martin Giese - - diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/configuration/package-info.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/configuration/package-info.java new file mode 100644 index 0000000000..3e6b71238d --- /dev/null +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/configuration/package-info.java @@ -0,0 +1,4 @@ +/** + * This package contains classes to do with the configuration / settings of KeY. + */ +package de.uka.ilkd.key.gui.configuration; \ No newline at end of file diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/configuration/package.html b/key.ui/src/main/java/de/uka/ilkd/key/gui/configuration/package.html deleted file mode 100644 index 76bd7c6dec..0000000000 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/configuration/package.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - -This package contains classes to do with the configuration / settings of KeY. - - \ No newline at end of file diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/package-info.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/package-info.java new file mode 100644 index 0000000000..9a0f762150 --- /dev/null +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/package-info.java @@ -0,0 +1,4 @@ +/** + * This package contains classes forming the graphical user interface of KeY. + */ +package de.uka.ilkd.key.gui; \ No newline at end of file diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/package.html b/key.ui/src/main/java/de/uka/ilkd/key/gui/package.html deleted file mode 100644 index 64175fb5d2..0000000000 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/package.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - -This package contains classes forming the graphical user interface of KeY. - - \ No newline at end of file diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/package-info.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/package-info.java new file mode 100644 index 0000000000..e9af4b204b --- /dev/null +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/package-info.java @@ -0,0 +1,4 @@ +/** + * This package contains the graphical user interface of the SMT backend. + */ +package de.uka.ilkd.key.gui.smt; \ No newline at end of file diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/package.html b/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/package.html deleted file mode 100644 index 17096586f5..0000000000 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/package.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - -This package contains the graphical user interface of the SMT backend. - - \ No newline at end of file diff --git a/recoder/src/main/java/recoder/abstraction/package-info.java b/recoder/src/main/java/recoder/abstraction/package-info.java new file mode 100644 index 0000000000..e6735125ac --- /dev/null +++ b/recoder/src/main/java/recoder/abstraction/package-info.java @@ -0,0 +1,18 @@ +/** + * This package contains the meta model abstractions as used by the + * semantical services. The {@link recoder.abstraction.ProgramModelElement}s + * hide the origin of the information, be it from Java source code, + * Java byte code, or predefined lacking any syntactical representation. + *

+ * There are three implicitly defined entities - + * {@link recoder.abstraction.ArrayType}, + * {@link recoder.abstraction.DefaultConstructor}, and + * {@link recoder.abstraction.Package}, as well as the predefined + * types {@link recoder.abstraction.NullType} and the base class for + * the small number of {@link recoder.abstraction.PrimitiveType}s. + *

+ * {@link recoder.java.ScopeDefiningElement}s are initialized by + * {@link recoder.service.SourceInfo} implementations; the corresponding + * methods should not be uses by others. + */ +package recoder.abstraction; \ No newline at end of file diff --git a/recoder/src/main/java/recoder/abstraction/package.html b/recoder/src/main/java/recoder/abstraction/package.html deleted file mode 100644 index 75cad5cd27..0000000000 --- a/recoder/src/main/java/recoder/abstraction/package.html +++ /dev/null @@ -1,17 +0,0 @@ - -This package contains the meta model abstractions as used by the -semantical services. The {@link recoder.abstraction.ProgramModelElement}s -hide the origin of the information, be it from Java source code, -Java byte code, or predefined lacking any syntactical representation. -

- There are three implicitly defined entities - - {@link recoder.abstraction.ArrayType}, - {@link recoder.abstraction.DefaultConstructor}, and - {@link recoder.abstraction.Package}, as well as the predefined - types {@link recoder.abstraction.NullType} and the base class for - the small number of {@link recoder.abstraction.PrimitiveType}s. -

- {@link recoder.java.ScopeDefiningElement}s are initialized by - {@link recoder.service.SourceInfo} implementations; the corresponding - methods should not be uses by others. - diff --git a/recoder/src/main/java/recoder/bytecode/package-info.java b/recoder/src/main/java/recoder/bytecode/package-info.java new file mode 100644 index 0000000000..b1c78d7885 --- /dev/null +++ b/recoder/src/main/java/recoder/bytecode/package-info.java @@ -0,0 +1,6 @@ +/** + * This package contains classes that cover information derived from Java byte + * code. As RECODER does not rewrite Bytecode, the information remains on + * interface level - no statements are analyzed. + */ +package recoder.bytecode; \ No newline at end of file diff --git a/recoder/src/main/java/recoder/bytecode/package.html b/recoder/src/main/java/recoder/bytecode/package.html deleted file mode 100644 index a9e07816b8..0000000000 --- a/recoder/src/main/java/recoder/bytecode/package.html +++ /dev/null @@ -1,5 +0,0 @@ - -This package contains classes that cover information derived from Java byte -code. As RECODER does not rewrite Bytecode, the information remains on -interface level - no statements are analyzed. - diff --git a/recoder/src/main/java/recoder/convenience/package-info.java b/recoder/src/main/java/recoder/convenience/package-info.java new file mode 100644 index 0000000000..af9b49f112 --- /dev/null +++ b/recoder/src/main/java/recoder/convenience/package-info.java @@ -0,0 +1,12 @@ +/** + * The convenience layer contains auxiliary functions that are useful in + * the context of RECODER. + *

    + *
  • The walker classes provide easy to use navigational aids for lists and + * trees and allow filtering for concrete types. + *
  • For debug and error output, there is a printf-like formatting engine. + *
  • There are routines for constructing qualified names and for creating + * artificial names. + *
+ */ +package recoder.convenience; \ No newline at end of file diff --git a/recoder/src/main/java/recoder/convenience/package.html b/recoder/src/main/java/recoder/convenience/package.html deleted file mode 100644 index 5400b84622..0000000000 --- a/recoder/src/main/java/recoder/convenience/package.html +++ /dev/null @@ -1,12 +0,0 @@ - -The convenience layer contains auxiliary functions that are useful in -the context of RECODER. -
    -
  • The walker classes provide easy to use navigational aids for lists and - trees and allow filtering for concrete types. -
  • For debug and error output, there is a printf-like formatting engine. -
  • There are routines for constructing qualified names and for creating - artificial names. -
- - diff --git a/recoder/src/main/java/recoder/io/package-info.java b/recoder/src/main/java/recoder/io/package-info.java new file mode 100644 index 0000000000..98e7604ae8 --- /dev/null +++ b/recoder/src/main/java/recoder/io/package-info.java @@ -0,0 +1,6 @@ +/** + * The io package provides classes to import and export source and class files. + * The abstractions hide where the information stems from or should go to, + * e.g. files with various file formats, databases or graphical interfaces. + */ +package recoder.io; \ No newline at end of file diff --git a/recoder/src/main/java/recoder/io/package.html b/recoder/src/main/java/recoder/io/package.html deleted file mode 100644 index 9f79e194c4..0000000000 --- a/recoder/src/main/java/recoder/io/package.html +++ /dev/null @@ -1,5 +0,0 @@ - -The io package provides classes to import and export source and class files. -The abstractions hide where the information stems from or should go to, -e.g. files with various file formats, databases or graphical interfaces. - diff --git a/recoder/src/main/java/recoder/java/declaration/modifier/package-info.java b/recoder/src/main/java/recoder/java/declaration/modifier/package-info.java new file mode 100644 index 0000000000..ce1ef2e01d --- /dev/null +++ b/recoder/src/main/java/recoder/java/declaration/modifier/package-info.java @@ -0,0 +1,6 @@ +/** + * This package collects all Java modifiers. The sole abstraction beneath + * the parent {@link recoder.java.declaration.Modifier} is the + * {@link recoder.java.declaration.modifier.VisibilityModifier}. + */ +package recoder.java.declaration.modifier; \ No newline at end of file diff --git a/recoder/src/main/java/recoder/java/declaration/modifier/package.html b/recoder/src/main/java/recoder/java/declaration/modifier/package.html deleted file mode 100644 index 8e49748a0d..0000000000 --- a/recoder/src/main/java/recoder/java/declaration/modifier/package.html +++ /dev/null @@ -1,5 +0,0 @@ - -This package collects all Java modifiers. The sole abstraction beneath -the parent {@link recoder.java.declaration.Modifier} is the -{@link recoder.java.declaration.modifier.VisibilityModifier}. - diff --git a/recoder/src/main/java/recoder/java/declaration/package-info.java b/recoder/src/main/java/recoder/java/declaration/package-info.java new file mode 100644 index 0000000000..d64a7973b1 --- /dev/null +++ b/recoder/src/main/java/recoder/java/declaration/package-info.java @@ -0,0 +1,11 @@ +/** + * Elements of the Java syntax tree representing declarations. + * For each declaration, there exists a corresponding + * {@link recoder.java.Reference} in the {@link recoder.java.reference} + * package. + * Each {@link recoder.java.Declaration} + * provides some convenience methods that query the possible modifiers. + * The modifiers themselves are collected in the subpackage + * {@link recoder.java.declaration.modifier}. + */ +package recoder.java.declaration; \ No newline at end of file diff --git a/recoder/src/main/java/recoder/java/declaration/package.html b/recoder/src/main/java/recoder/java/declaration/package.html deleted file mode 100644 index 96b95d839a..0000000000 --- a/recoder/src/main/java/recoder/java/declaration/package.html +++ /dev/null @@ -1,10 +0,0 @@ - -Elements of the Java syntax tree representing declarations. -For each declaration, there exists a corresponding -{@link recoder.java.Reference} in the {@link recoder.java.reference} -package. -Each {@link recoder.java.Declaration} -provides some convenience methods that query the possible modifiers. -The modifiers themselves are collected in the subpackage -{@link recoder.java.declaration.modifier}. - diff --git a/recoder/src/main/java/recoder/java/expression/literal/package-info.java b/recoder/src/main/java/recoder/java/expression/literal/package-info.java new file mode 100644 index 0000000000..c87f527e51 --- /dev/null +++ b/recoder/src/main/java/recoder/java/expression/literal/package-info.java @@ -0,0 +1,7 @@ +/** + * This package contains representations for the various Java literal types. + * Quite special are the non-primitive + * {@link recoder.java.expression.literal.NullLiteral} and + * {@link recoder.java.expression.literal.StringLiteral}. + */ +package recoder.java.expression.literal; \ No newline at end of file diff --git a/recoder/src/main/java/recoder/java/expression/literal/package.html b/recoder/src/main/java/recoder/java/expression/literal/package.html deleted file mode 100644 index 8ec441a6bc..0000000000 --- a/recoder/src/main/java/recoder/java/expression/literal/package.html +++ /dev/null @@ -1,6 +0,0 @@ - -This package contains representations for the various Java literal types. -Quite special are the non-primitive -{@link recoder.java.expression.literal.NullLiteral} and -{@link recoder.java.expression.literal.StringLiteral}. - diff --git a/recoder/src/main/java/recoder/java/expression/operator/package-info.java b/recoder/src/main/java/recoder/java/expression/operator/package-info.java new file mode 100644 index 0000000000..13d009834f --- /dev/null +++ b/recoder/src/main/java/recoder/java/expression/operator/package-info.java @@ -0,0 +1,7 @@ +/** + * Elements of the Java syntax tree representing operators and operator-like + * expressions. + * {@link recoder.java.expression.operator.New} is also considered an + * operator ({@link recoder.java.expression.operator.TypeOperator}). + */ +package recoder.java.expression.operator; \ No newline at end of file diff --git a/recoder/src/main/java/recoder/java/expression/operator/package.html b/recoder/src/main/java/recoder/java/expression/operator/package.html deleted file mode 100644 index 00f1d5cb75..0000000000 --- a/recoder/src/main/java/recoder/java/expression/operator/package.html +++ /dev/null @@ -1,6 +0,0 @@ - -Elements of the Java syntax tree representing operators and operator-like -expressions. -{@link recoder.java.expression.operator.New} is also considered an -operator ({@link recoder.java.expression.operator.TypeOperator}). - diff --git a/recoder/src/main/java/recoder/java/expression/package-info.java b/recoder/src/main/java/recoder/java/expression/package-info.java new file mode 100644 index 0000000000..6e426b0b81 --- /dev/null +++ b/recoder/src/main/java/recoder/java/expression/package-info.java @@ -0,0 +1,6 @@ +/** + * Elements of the Java syntax tree representing expressions. + * The various operators and literals are bundled in the corresponding + * subpackages. + */ +package recoder.java.expression; \ No newline at end of file diff --git a/recoder/src/main/java/recoder/java/expression/package.html b/recoder/src/main/java/recoder/java/expression/package.html deleted file mode 100644 index 1d82f6c92f..0000000000 --- a/recoder/src/main/java/recoder/java/expression/package.html +++ /dev/null @@ -1,5 +0,0 @@ - -Elements of the Java syntax tree representing expressions. -The various operators and literals are bundled in the corresponding -subpackages. - diff --git a/recoder/src/main/java/recoder/java/package-info.java b/recoder/src/main/java/recoder/java/package-info.java new file mode 100644 index 0000000000..3dfa4049ea --- /dev/null +++ b/recoder/src/main/java/recoder/java/package-info.java @@ -0,0 +1,135 @@ +/** + * This package contains classes that cover the Java programming language. + * These classes are fundamental for syntactical transformations and deserve + * a detailed overview. + *
+ *
Source and Program Elements
+ *
+ * A {@link recoder.java.SourceElement} is a syntactical entity and not + * necessary a {@link recoder.ModelElement}, such as a {@link recoder.java.Comment}. + * Each {@link recoder.java.SourceElement} knows its + * {@link recoder.ProgramFactory}, its indentation and how to + * {@link recoder.java.SourceElement#deepClone} itself. + *

+ * A {@link recoder.java.ProgramElement} is a {@link recoder.java.SourceElement} + * and a {@link recoder.ModelElement}. It is aware of its parent in the syntax + * tree, while a pure {@link recoder.java.SourceElement} is not considered as a + * member of the AST even though it is represented in the sources. + *

+ * {@link recoder.java.ProgramElement}s are further + * classified into {@link recoder.java.TerminalProgramElement}s and + * {@link recoder.java.NonTerminalProgramElement}s (this is another + * Composite pattern). While {@link recoder.java.TerminalProgramElement} + * is just a tag class, {@link recoder.java.NonTerminalProgramElement}s know + * their AST children (while it is possible that they do not have any). + * A complete source file occurs as a {@link recoder.java.CompilationUnit}. + *

+ * {@link recoder.java.JavaSourceElement} and + * {@link recoder.java.JavaProgramElement} are abstract classes defining + * standard implementations that already know their + * {@link recoder.java.JavaProgramFactory}. + *

+ *

+ *

Validation
+ *
+ * Calling the {@link recoder.ModelElement#validate()} method of a + * {@link recoder.ModelElement} will check its consistency similar to the + * analysis a compiler does. In case of an inconsistency, a + * {@link recoder.ModelException} is thrown. The + * {@link recoder.ModelElement#validate()} method of a + * {@link recoder.java.ProgramElement} will check its children if + * necessary. Calling {@link recoder.ModelElement#validate()} for a + * {@link recoder.java.CompilationUnit} will check the consistency of the + * whole module. + *

+ * A {@link recoder.java.NonTerminalProgramElement} defines a + * {@link recoder.java.NonTerminalProgramElement#makeParentRoleValid()} method + * that sets all parent links of the current children. Not that a + * {@link recoder.java.SourceElement} automatically keeps track of any attached + * {@link recoder.java.Comment}. + * The method is automatically invoked by each constructor that creates a + * concrete and valid program element. Since some constructors create + * partially initialized nodes only, there is no need to make them valid at + * that time. + *

+ *

+ *

Expressions and Statements
+ *
+ * {@link recoder.java.Expression} and {@link recoder.java.Statement} are + * self-explanatory. A {@link recoder.java.LoopInitializer} is a special + * {@link recoder.java.Statement} valid as initializer of + * {@link recoder.java.statement.For} loops. + * {@link recoder.java.LoopInitializer} is subtyped by + * {@link recoder.java.expression.ExpressionStatement} and + * {@link recoder.java.declaration.LocalVariableDeclaration}). + *

+ * Concrete classes and further abstractions are bundled in the + * {@link recoder.java.expression} and {@link recoder.java.statement} packages. + *

+ *

+ *

Syntax Tree Parents
+ *
+ * There are a couple of abstractions dealing with properties of being a + * parent node, which is used for upwards traversals in the syntax tree. + *

+ * These are {@link recoder.java.declaration.TypeDeclarationContainer}, + * {@link recoder.java.ExpressionContainer}, + * {@link recoder.java.StatementContainer}, + * {@link recoder.java.ParameterContainer}, + * {@link recoder.java.NamedProgramElement} and + * {@link recoder.java.reference.TypeReferenceContainer}. A + * An {@link recoder.java.ExpressionContainer} contains + * {@link recoder.java.Expression}s, a + * {@link recoder.java.StatementContainer} contains + * {@link recoder.java.Statement}s, a + * {@link recoder.java.ParameterContainer} + * (either a {@link recoder.java.declaration.MethodDeclaration} or a + * {@link recoder.java.statement.Catch} statement) contains + * {@link recoder.java.declaration.ParameterDeclaration}s. + * A {@link recoder.java.NamedProgramElement} is a subtype of + * {@link recoder.NamedModelElement}. + * A {@link recoder.java.reference.TypeReferenceContainer} contains one or + * several names, but these are names of types that are referred to explicitely + * by a {@link recoder.java.reference.TypeReference}. + *

+ *

+ *

References
+ *
+ * A {@link recoder.java.Reference} is an explicite use of an entity. Most of + * these {@link recoder.java.Reference}s are + * {@link recoder.java.reference.NameReference}s + * and as such {@link recoder.java.NamedProgramElement}s, e.g. the + * {@link recoder.java.reference.TypeReference}. + * Subtypes of {@link recoder.java.Reference}s are bundled in the + * {@link recoder.java.reference} package. + *
+ *

+ *

Modifiers and Declarations
+ *
+ * {@link recoder.java.declaration.Modifier}s are (exclusively) used in the + * context of {@link recoder.java.Declaration}s. + * {@link recoder.java.declaration.Modifier}s occur explictely, since they occur + * as syntactical tokens that might be indented and commented. + * {@link recoder.java.Declaration}s are either + * declarations of types or other entities such as + * {@link recoder.java.declaration.MemberDeclaration} or + * {@link recoder.java.declaration.VariableDeclaration}. Concrete + * {@link recoder.java.declaration.Modifier}s and + * {@link recoder.java.Declaration}s are + * bundled in the {@link recoder.java.declaration.modifier} and + * {@link recoder.java.declaration} packages. + *
+ *

+ *

Comments
+ *
+ * A {@link recoder.java.ProgramElement} can have a list of + * {@link recoder.java.Comment}s attached. + *

+ * While a pure {@link recoder.java.Comment} can extend to several lines, a + * {@link recoder.java.SingleLineComment} may not contain linefeeds. + * A {@link recoder.java.DocComment} is a special comment used for + * documentation systems such as JavaDoc or DOC++. + *

+ *
+ */ +package recoder.java; \ No newline at end of file diff --git a/recoder/src/main/java/recoder/java/package.html b/recoder/src/main/java/recoder/java/package.html deleted file mode 100644 index 4ad739db14..0000000000 --- a/recoder/src/main/java/recoder/java/package.html +++ /dev/null @@ -1,134 +0,0 @@ - -This package contains classes that cover the Java programming language. -These classes are fundamental for syntactical transformations and deserve -a detailed overview. -
-
Source and Program Elements
-
- A {@link recoder.java.SourceElement} is a syntactical entity and not - necessary a {@link recoder.ModelElement}, such as a {@link recoder.java.Comment}. - Each {@link recoder.java.SourceElement} knows its - {@link recoder.ProgramFactory}, its indentation and how to - {@link recoder.java.SourceElement#deepClone} itself. -

- A {@link recoder.java.ProgramElement} is a {@link recoder.java.SourceElement} - and a {@link recoder.ModelElement}. It is aware of its parent in the syntax - tree, while a pure {@link recoder.java.SourceElement} is not considered as a - member of the AST even though it is represented in the sources. -

- {@link recoder.java.ProgramElement}s are further - classified into {@link recoder.java.TerminalProgramElement}s and - {@link recoder.java.NonTerminalProgramElement}s (this is another - Composite pattern). While {@link recoder.java.TerminalProgramElement} - is just a tag class, {@link recoder.java.NonTerminalProgramElement}s know - their AST children (while it is possible that they do not have any). - A complete source file occurs as a {@link recoder.java.CompilationUnit}. -

- {@link recoder.java.JavaSourceElement} and - {@link recoder.java.JavaProgramElement} are abstract classes defining - standard implementations that already know their - {@link recoder.java.JavaProgramFactory}. -

-

-

Validation
-
- Calling the {@link recoder.ModelElement#validate()} method of a - {@link recoder.ModelElement} will check its consistency similar to the - analysis a compiler does. In case of an inconsistency, a - {@link recoder.ModelException} is thrown. The - {@link recoder.ModelElement#validate()} method of a - {@link recoder.java.ProgramElement} will check its children if - necessary. Calling {@link recoder.ModelElement#validate()} for a - {@link recoder.java.CompilationUnit} will check the consistency of the - whole module. -

- A {@link recoder.java.NonTerminalProgramElement} defines a - {@link recoder.java.NonTerminalProgramElement#makeParentRoleValid()} method - that sets all parent links of the current children. Not that a - {@link recoder.java.SourceElement} automatically keeps track of any attached - {@link recoder.java.Comment}. - The method is automatically invoked by each constructor that creates a - concrete and valid program element. Since some constructors create - partially initialized nodes only, there is no need to make them valid at - that time. -

-

-

Expressions and Statements
-
- {@link recoder.java.Expression} and {@link recoder.java.Statement} are - self-explanatory. A {@link recoder.java.LoopInitializer} is a special - {@link recoder.java.Statement} valid as initializer of - {@link recoder.java.statement.For} loops. - {@link recoder.java.LoopInitializer} is subtyped by - {@link recoder.java.expression.ExpressionStatement} and - {@link recoder.java.declaration.LocalVariableDeclaration}). -

- Concrete classes and further abstractions are bundled in the - {@link recoder.java.expression} and {@link recoder.java.statement} packages. -

-

-

Syntax Tree Parents
-
- There are a couple of abstractions dealing with properties of being a - parent node, which is used for upwards traversals in the syntax tree. -

- These are {@link recoder.java.declaration.TypeDeclarationContainer}, - {@link recoder.java.ExpressionContainer}, - {@link recoder.java.StatementContainer}, - {@link recoder.java.ParameterContainer}, - {@link recoder.java.NamedProgramElement} and - {@link recoder.java.reference.TypeReferenceContainer}. A - An {@link recoder.java.ExpressionContainer} contains - {@link recoder.java.Expression}s, a - {@link recoder.java.StatementContainer} contains - {@link recoder.java.Statement}s, a - {@link recoder.java.ParameterContainer} - (either a {@link recoder.java.declaration.MethodDeclaration} or a - {@link recoder.java.statement.Catch} statement) contains - {@link recoder.java.declaration.ParameterDeclaration}s. - A {@link recoder.java.NamedProgramElement} is a subtype of - {@link recoder.NamedModelElement}. - A {@link recoder.java.reference.TypeReferenceContainer} contains one or - several names, but these are names of types that are referred to explicitely - by a {@link recoder.java.reference.TypeReference}. -

-

-

References
-
- A {@link recoder.java.Reference} is an explicite use of an entity. Most of - these {@link recoder.java.Reference}s are - {@link recoder.java.reference.NameReference}s - and as such {@link recoder.java.NamedProgramElement}s, e.g. the - {@link recoder.java.reference.TypeReference}. - Subtypes of {@link recoder.java.Reference}s are bundled in the - {@link recoder.java.reference} package. -
-

-

Modifiers and Declarations
-
- {@link recoder.java.declaration.Modifier}s are (exclusively) used in the - context of {@link recoder.java.Declaration}s. - {@link recoder.java.declaration.Modifier}s occur explictely, since they occur - as syntactical tokens that might be indented and commented. - {@link recoder.java.Declaration}s are either - declarations of types or other entities such as - {@link recoder.java.declaration.MemberDeclaration} or - {@link recoder.java.declaration.VariableDeclaration}. Concrete - {@link recoder.java.declaration.Modifier}s and - {@link recoder.java.Declaration}s are - bundled in the {@link recoder.java.declaration.modifier} and - {@link recoder.java.declaration} packages. -
-

-

Comments
-
- A {@link recoder.java.ProgramElement} can have a list of - {@link recoder.java.Comment}s attached. -

- While a pure {@link recoder.java.Comment} can extend to several lines, a - {@link recoder.java.SingleLineComment} may not contain linefeeds. - A {@link recoder.java.DocComment} is a special comment used for - documentation systems such as JavaDoc or DOC++. -

-
- diff --git a/recoder/src/main/java/recoder/java/reference/package-info.java b/recoder/src/main/java/recoder/java/reference/package-info.java new file mode 100644 index 0000000000..e6e28b2b92 --- /dev/null +++ b/recoder/src/main/java/recoder/java/reference/package-info.java @@ -0,0 +1,5 @@ +/** + * Elements of the Java syntax tree representing implicit or explicit (named) + * references to other program elements. + */ +package recoder.java.reference; \ No newline at end of file diff --git a/recoder/src/main/java/recoder/java/reference/package.html b/recoder/src/main/java/recoder/java/reference/package.html deleted file mode 100644 index 552721738c..0000000000 --- a/recoder/src/main/java/recoder/java/reference/package.html +++ /dev/null @@ -1,4 +0,0 @@ - -Elements of the Java syntax tree representing implicit or explicit (named) -references to other program elements. - diff --git a/recoder/src/main/java/recoder/java/statement/package-info.java b/recoder/src/main/java/recoder/java/statement/package-info.java new file mode 100644 index 0000000000..02f3e72f3f --- /dev/null +++ b/recoder/src/main/java/recoder/java/statement/package-info.java @@ -0,0 +1,6 @@ +/** + * Elements of the Java syntax tree representing pure statements. + * Besides these other valid statements are the various expressions with + * side effects ({@link recoder.java.expression.ExpressionStatement}s). + */ +package recoder.java.statement; \ No newline at end of file diff --git a/recoder/src/main/java/recoder/java/statement/package.html b/recoder/src/main/java/recoder/java/statement/package.html deleted file mode 100644 index 0338952554..0000000000 --- a/recoder/src/main/java/recoder/java/statement/package.html +++ /dev/null @@ -1,5 +0,0 @@ - -Elements of the Java syntax tree representing pure statements. -Besides these other valid statements are the various expressions with -side effects ({@link recoder.java.expression.ExpressionStatement}s). - diff --git a/recoder/src/main/java/recoder/kit/package-info.java b/recoder/src/main/java/recoder/kit/package-info.java new file mode 100644 index 0000000000..8fc4ce19ab --- /dev/null +++ b/recoder/src/main/java/recoder/kit/package-info.java @@ -0,0 +1,9 @@ +/** + * This package contains the RECODER transformation framework. + * The auxiliary "kit" classes contain queries and factory methods, + * while high level transformations are subclasses of + * {@link recoder.kit.Transformation}. Transformations report + * possible problems; specialized problem reports are collected + * in the {@link recoder.kit.transformation} package. + */ +package recoder.kit; \ No newline at end of file diff --git a/recoder/src/main/java/recoder/kit/package.html b/recoder/src/main/java/recoder/kit/package.html deleted file mode 100644 index ad2af3f944..0000000000 --- a/recoder/src/main/java/recoder/kit/package.html +++ /dev/null @@ -1,8 +0,0 @@ - -This package contains the RECODER transformation framework. -The auxiliary "kit" classes contain queries and factory methods, -while high level transformations are subclasses of -{@link recoder.kit.Transformation}. Transformations report -possible problems; specialized problem reports are collected -in the {@link recoder.kit.transformation} package. - diff --git a/recoder/src/main/java/recoder/kit/pattern/package-info.java b/recoder/src/main/java/recoder/kit/pattern/package-info.java new file mode 100644 index 0000000000..a2059e6180 --- /dev/null +++ b/recoder/src/main/java/recoder/kit/pattern/package-info.java @@ -0,0 +1,10 @@ +/** + * This package contains classes that model design patterns; it is far from + * being stable and will be subject to changes. + *

+ * Each instance of a pattern knows its participants and serves as an entry + * of a pattern repository. In addition, pattern classes provide means to + * generate certain pattern implementations and can check parts of their + * contracts. + */ +package recoder.kit.pattern; \ No newline at end of file diff --git a/recoder/src/main/java/recoder/kit/pattern/package.html b/recoder/src/main/java/recoder/kit/pattern/package.html deleted file mode 100644 index c4cab1550a..0000000000 --- a/recoder/src/main/java/recoder/kit/pattern/package.html +++ /dev/null @@ -1,9 +0,0 @@ - -This package contains classes that model design patterns; it is far from -being stable and will be subject to changes. -

- Each instance of a pattern knows its participants and serves as an entry - of a pattern repository. In addition, pattern classes provide means to - generate certain pattern implementations and can check parts of their - contracts. - diff --git a/recoder/src/main/java/recoder/kit/transformation/package-info.java b/recoder/src/main/java/recoder/kit/transformation/package-info.java new file mode 100644 index 0000000000..5b4929cf88 --- /dev/null +++ b/recoder/src/main/java/recoder/kit/transformation/package-info.java @@ -0,0 +1,5 @@ +/** + * This package contains transformation command objects and + * associated problem reports. + */ +package recoder.kit.transformation; \ No newline at end of file diff --git a/recoder/src/main/java/recoder/kit/transformation/package.html b/recoder/src/main/java/recoder/kit/transformation/package.html deleted file mode 100644 index 5d5811d691..0000000000 --- a/recoder/src/main/java/recoder/kit/transformation/package.html +++ /dev/null @@ -1,4 +0,0 @@ - -This package contains transformation command objects and -associated problem reports. - diff --git a/recoder/src/main/java/recoder/list/package-info.java b/recoder/src/main/java/recoder/list/package-info.java new file mode 100644 index 0000000000..0df7a945a2 --- /dev/null +++ b/recoder/src/main/java/recoder/list/package-info.java @@ -0,0 +1,43 @@ +/** + * This package containes generated list and iterator types. + *

+ *
Implementation
+ *
+ * The elements are addressed by indices rather than iterators or + * explicite nodes. This saves storage and provides a slim interface. + *

+ * The default implementations end with "ArrayList" and use the common + * array doubling technique. + * If elements must be added and the number is known a-priori (e.g. before + * concatenating a set of lists), it is wise to increase the capacity of the + * array with {@link recoder.list.ObjectArrayList#ensureCapacity}. + *

+ *
Genericity
+ *
+ * The lists are heterogeneous emulations of generic classes. + * Specialized versions inherit from {@link recoder.list.ObjectList} and delegate + * to the "untyped" (i.e. Object type) methods. Since the untyped + * methods are not public in {@link recoder.list.ObjectList}, this is quite safe. + *
+ *
Mutability
+ *
+ * The standard list interfaces are read-only. To modify a list, one must + * use a XYZMutableList that extends the corresponding XYZList interface. + *

+ * The read-only List interfaces are additionally inherited in parallel to + * the relations between the element types: A {@link recoder.list.ModifierList} + * extends a {@link recoder.list.ProgramElementList} which in turn extends an + * {@link recoder.list.ModelElementList} which extends the + * {@link recoder.list.ObjectList}. With this technique, it is possible + * to add a {@link recoder.list.ModifierList} to a + * {@link recoder.list.ProgramElementMutableList} + * (the {@link recoder.list.ObjectArrayList#add} method expects a + * {@link recoder.list.ProgramElementList} which is a proper superclass of + * {@link recoder.list.ModifierList}). + * Note that to avoid covariance problems (i.e. the preconditions of e.g. + * add methods are not in a sense compatible in polymorphic contexts), the + * mutable lists are not inherited from each other. + *

+ *
+ */ +package recoder.list; \ No newline at end of file diff --git a/recoder/src/main/java/recoder/list/package.html b/recoder/src/main/java/recoder/list/package.html deleted file mode 100644 index 8e7089afa6..0000000000 --- a/recoder/src/main/java/recoder/list/package.html +++ /dev/null @@ -1,43 +0,0 @@ - - -This package containes generated list and iterator types. -
-
Implementation
-
- The elements are addressed by indices rather than iterators or - explicite nodes. This saves storage and provides a slim interface. -

- The default implementations end with "ArrayList" and use the common - array doubling technique. - If elements must be added and the number is known a-priori (e.g. before - concatenating a set of lists), it is wise to increase the capacity of the - array with {@link recoder.list.ObjectArrayList#ensureCapacity}. -

-
Genericity
-
- The lists are heterogeneous emulations of generic classes. - Specialized versions inherit from {@link recoder.list.ObjectList} and delegate - to the "untyped" (i.e. Object type) methods. Since the untyped - methods are not public in {@link recoder.list.ObjectList}, this is quite safe. -
-
Mutability
-
- The standard list interfaces are read-only. To modify a list, one must - use a XYZMutableList that extends the corresponding XYZList interface. -

- The read-only List interfaces are additionally inherited in parallel to - the relations between the element types: A {@link recoder.list.ModifierList} - extends a {@link recoder.list.ProgramElementList} which in turn extends an - {@link recoder.list.ModelElementList} which extends the - {@link recoder.list.ObjectList}. With this technique, it is possible - to add a {@link recoder.list.ModifierList} to a - {@link recoder.list.ProgramElementMutableList} - (the {@link recoder.list.ObjectArrayList#add} method expects a - {@link recoder.list.ProgramElementList} which is a proper superclass of - {@link recoder.list.ModifierList}). - Note that to avoid covariance problems (i.e. the preconditions of e.g. - add methods are not in a sense compatible in polymorphic contexts), the - mutable lists are not inherited from each other. -

-
- \ No newline at end of file diff --git a/recoder/src/main/java/recoder/package-info.java b/recoder/src/main/java/recoder/package-info.java new file mode 100644 index 0000000000..6cc1632a8c --- /dev/null +++ b/recoder/src/main/java/recoder/package-info.java @@ -0,0 +1,17 @@ +/** + * This package contains some basic definitions. + *

+ * The central class of the RECODER system is {@link recoder.ServiceConfiguration} + * which is responsible for maintaining all information repositories. A very + * important repository is the {@link recoder.io.SourceFileRepository}, which + * holds the set of known syntax trees. The construction of new syntax elements + * lays in the responsibility of the {@link recoder.ProgramFactory} which also + * allows access to a parser for the given language or language dialect. + * Other repositories may know about additional abstractions or may + * provide results derived by semantical analyses. + *

+ * Besides of the base repositories, the package also contains some base + * abstractions. + * {@link recoder.ModelElement} is the parent of most other classes of the model. + */ +package recoder; \ No newline at end of file diff --git a/recoder/src/main/java/recoder/package.html b/recoder/src/main/java/recoder/package.html deleted file mode 100644 index e9c52eba38..0000000000 --- a/recoder/src/main/java/recoder/package.html +++ /dev/null @@ -1,16 +0,0 @@ - -This package contains some basic definitions. -

- The central class of the RECODER system is {@link recoder.ServiceConfiguration} - which is responsible for maintaining all information repositories. A very - important repository is the {@link recoder.io.SourceFileRepository}, which - holds the set of known syntax trees. The construction of new syntax elements - lays in the responsibility of the {@link recoder.ProgramFactory} which also - allows access to a parser for the given language or language dialect. - Other repositories may know about additional abstractions or may - provide results derived by semantical analyses. -

- Besides of the base repositories, the package also contains some base - abstractions. - {@link recoder.ModelElement} is the parent of most other classes of the model. - diff --git a/recoder/src/main/java/recoder/parser/package-info.java b/recoder/src/main/java/recoder/parser/package-info.java new file mode 100644 index 0000000000..22ef5987d2 --- /dev/null +++ b/recoder/src/main/java/recoder/parser/package-info.java @@ -0,0 +1,6 @@ +/** + * This package contains the JavaCC generated parser. It is not meant + * to be used directly; instead, the {@link recoder.ProgramFactory} defines + * appropriate access methods. + */ +package recoder.parser; \ No newline at end of file diff --git a/recoder/src/main/java/recoder/parser/package.html b/recoder/src/main/java/recoder/parser/package.html deleted file mode 100644 index d44a5b2b2c..0000000000 --- a/recoder/src/main/java/recoder/parser/package.html +++ /dev/null @@ -1,5 +0,0 @@ - -This package contains the JavaCC generated parser. It is not meant -to be used directly; instead, the {@link recoder.ProgramFactory} defines -appropriate access methods. - diff --git a/recoder/src/main/java/recoder/service/package-info.java b/recoder/src/main/java/recoder/service/package-info.java new file mode 100644 index 0000000000..af9aca3d0b --- /dev/null +++ b/recoder/src/main/java/recoder/service/package-info.java @@ -0,0 +1,4 @@ +/** + * This package contains the semantical services of RECODER. + */ +package recoder.service; \ No newline at end of file diff --git a/recoder/src/main/java/recoder/service/package.html b/recoder/src/main/java/recoder/service/package.html deleted file mode 100644 index d53b83ff20..0000000000 --- a/recoder/src/main/java/recoder/service/package.html +++ /dev/null @@ -1,3 +0,0 @@ - -This package contains the semantical services of RECODER. - diff --git a/recoder/src/main/java/recoder/util/package-info.java b/recoder/src/main/java/recoder/util/package-info.java new file mode 100644 index 0000000000..4d83b9b12f --- /dev/null +++ b/recoder/src/main/java/recoder/util/package-info.java @@ -0,0 +1,8 @@ +/** + * This package provides basic data types and algorithms. + * The equality and order relations are materialized to allow for multiple + * variants instead of one fixed version. For instance, it is possible + * to create a hash table that uses object identity, the fixed "natural" + * hash codes, or any other version. + */ +package recoder.util; \ No newline at end of file diff --git a/recoder/src/main/java/recoder/util/package.html b/recoder/src/main/java/recoder/util/package.html deleted file mode 100644 index 8e417d91eb..0000000000 --- a/recoder/src/main/java/recoder/util/package.html +++ /dev/null @@ -1,7 +0,0 @@ - -This package provides basic data types and algorithms. -The equality and order relations are materialized to allow for multiple -variants instead of one fixed version. For instance, it is possible -to create a hash table that uses object identity, the fixed "natural" -hash codes, or any other version. - diff --git a/recoder/src/test/resources/java5/src/transformations/util/package-info.java b/recoder/src/test/resources/java5/src/transformations/util/package-info.java new file mode 100644 index 0000000000..b19cecd47c --- /dev/null +++ b/recoder/src/test/resources/java5/src/transformations/util/package-info.java @@ -0,0 +1,8 @@ +/** + * This package provides basic data types and algorithms. + * The equality and order relations are materialized to allow for multiple + * variants instead of one fixed version. For instance, it is possible + * to create a hash table that uses object identity, the fixed "natural" + * hash codes, or any other version. + */ +package java5.src.transformations.util; \ No newline at end of file diff --git a/recoder/src/test/resources/java5/src/transformations/util/package.html b/recoder/src/test/resources/java5/src/transformations/util/package.html deleted file mode 100644 index 8e417d91eb..0000000000 --- a/recoder/src/test/resources/java5/src/transformations/util/package.html +++ /dev/null @@ -1,7 +0,0 @@ - -This package provides basic data types and algorithms. -The equality and order relations are materialized to allow for multiple -variants instead of one fixed version. For instance, it is possible -to create a hash table that uses object identity, the fixed "natural" -hash codes, or any other version. - From 122166779fcd75f31cc4f799cea8386e28c9b39a Mon Sep 17 00:00:00 2001 From: Alexander Weigl Date: Fri, 29 Dec 2023 18:40:07 +0100 Subject: [PATCH 62/66] spotless reformat --- .../uka/ilkd/key/util/rifl/package-info.java | 2 +- .../key/java/abstraction/package-info.java | 2 +- .../declaration/modifier/package-info.java | 2 +- .../key/java/declaration/package-info.java | 2 +- .../java/expression/literal/package-info.java | 2 +- .../expression/operator/package-info.java | 2 +- .../key/java/expression/package-info.java | 2 +- .../de/uka/ilkd/key/java/package-info.java | 12 +++++---- .../key/java/recoderext/adt/package-info.java | 8 +++--- .../ilkd/key/java/reference/package-info.java | 2 +- .../ilkd/key/java/statement/package-info.java | 2 +- .../ilkd/key/java/visitor/package-info.java | 2 +- .../de/uka/ilkd/key/ldt/package-info.java | 2 +- .../uka/ilkd/key/logic/op/package-info.java | 2 +- .../de/uka/ilkd/key/logic/package-info.java | 25 ++++++++++++------- .../uka/ilkd/key/logic/sort/package-info.java | 2 +- .../java/de/uka/ilkd/key/pp/package-info.java | 2 +- .../uka/ilkd/key/proof/init/package-info.java | 2 +- .../uka/ilkd/key/proof/io/package-info.java | 2 +- .../uka/ilkd/key/proof/mgt/package-info.java | 2 +- .../de/uka/ilkd/key/proof/package-info.java | 2 +- .../uka/ilkd/key/rule/inst/package-info.java | 2 +- .../metaconstruct/arith/package-info.java | 4 +-- .../key/rule/metaconstruct/package-info.java | 4 +-- .../de/uka/ilkd/key/rule/package-info.java | 2 +- .../de/uka/ilkd/key/smt/package-info.java | 2 +- .../uka/ilkd/key/speclang/package-info.java | 2 +- .../uka/ilkd/key/strategy/package-info.java | 2 +- .../de/uka/ilkd/key/util/package-info.java | 2 +- .../de/uka/ilkd/key/util/pp/package-info.java | 24 +++++++++++------- .../key/gui/configuration/package-info.java | 2 +- .../de/uka/ilkd/key/gui/package-info.java | 2 +- .../de/uka/ilkd/key/gui/smt/package-info.java | 2 +- .../recoder/abstraction/package-info.java | 2 +- .../java/recoder/bytecode/package-info.java | 2 +- .../recoder/convenience/package-info.java | 2 +- .../main/java/recoder/io/package-info.java | 2 +- .../declaration/modifier/package-info.java | 2 +- .../java/declaration/package-info.java | 2 +- .../java/expression/literal/package-info.java | 2 +- .../expression/operator/package-info.java | 2 +- .../recoder/java/expression/package-info.java | 2 +- .../main/java/recoder/java/package-info.java | 2 +- .../recoder/java/reference/package-info.java | 2 +- .../recoder/java/statement/package-info.java | 2 +- .../main/java/recoder/kit/package-info.java | 2 +- .../recoder/kit/pattern/package-info.java | 2 +- .../kit/transformation/package-info.java | 2 +- .../main/java/recoder/list/package-info.java | 2 +- .../src/main/java/recoder/package-info.java | 2 +- .../java/recoder/parser/package-info.java | 2 +- .../java/recoder/service/package-info.java | 2 +- .../main/java/recoder/util/package-info.java | 2 +- 53 files changed, 94 insertions(+), 77 deletions(-) diff --git a/key.core.rifl/src/main/java/de/uka/ilkd/key/util/rifl/package-info.java b/key.core.rifl/src/main/java/de/uka/ilkd/key/util/rifl/package-info.java index 7420b91e7b..49bbd16322 100644 --- a/key.core.rifl/src/main/java/de/uka/ilkd/key/util/rifl/package-info.java +++ b/key.core.rifl/src/main/java/de/uka/ilkd/key/util/rifl/package-info.java @@ -5,4 +5,4 @@ * This package contains a transformer from input RIFL files (XML) and * original Java files to JML* annotated files. */ -package de.uka.ilkd.key.util.rifl; \ No newline at end of file +package de.uka.ilkd.key.util.rifl; diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/abstraction/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/abstraction/package-info.java index a609749214..a41fd6023c 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/java/abstraction/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/java/abstraction/package-info.java @@ -16,4 +16,4 @@ * {@link recoder.service.SourceInfo} implementations and should * not be modified from others. */ -package de.uka.ilkd.key.java.abstraction; \ No newline at end of file +package de.uka.ilkd.key.java.abstraction; diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/declaration/modifier/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/declaration/modifier/package-info.java index 0d1cddbc5c..573a2c02dc 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/java/declaration/modifier/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/java/declaration/modifier/package-info.java @@ -3,4 +3,4 @@ * the parent {@link recoder.java.declaration.Modifier} is the * {@link recoder.java.declaration.modifier.VisibilityModifier}. */ -package de.uka.ilkd.key.java.declaration.modifier; \ No newline at end of file +package de.uka.ilkd.key.java.declaration.modifier; diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/declaration/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/declaration/package-info.java index d7764b669e..4e9c501b3d 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/java/declaration/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/java/declaration/package-info.java @@ -8,4 +8,4 @@ * The modifiers themselves are collected in the subpackage * {@link recoder.java.declaration.modifier}. */ -package de.uka.ilkd.key.java.declaration; \ No newline at end of file +package de.uka.ilkd.key.java.declaration; diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/expression/literal/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/expression/literal/package-info.java index 1a2c375c96..6f573f8320 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/java/expression/literal/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/java/expression/literal/package-info.java @@ -4,4 +4,4 @@ * {@link recoder.java.expression.literal.NullLiteral} and * {@link recoder.java.expression.literal.StringLiteral}. */ -package de.uka.ilkd.key.java.expression.literal; \ No newline at end of file +package de.uka.ilkd.key.java.expression.literal; diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/expression/operator/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/expression/operator/package-info.java index 583fd4cbc1..e17b09bf1e 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/java/expression/operator/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/java/expression/operator/package-info.java @@ -4,4 +4,4 @@ * {@link recoder.java.expression.operator.New} is also considered an * operator ({@link recoder.java.expression.operator.TypeOperator}). */ -package de.uka.ilkd.key.java.expression.operator; \ No newline at end of file +package de.uka.ilkd.key.java.expression.operator; diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/expression/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/expression/package-info.java index ee80e567e0..67fcd0d116 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/java/expression/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/java/expression/package-info.java @@ -3,4 +3,4 @@ * The various operators and literals are bundled in the corresponding * subpackages. */ -package de.uka.ilkd.key.java.expression; \ No newline at end of file +package de.uka.ilkd.key.java.expression; diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/package-info.java index 5ae7d044d7..800a5af5b5 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/java/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/java/package-info.java @@ -12,7 +12,8 @@ *

Source and Program Elements
*
* A {@link de.uka.ilkd.key.java.SourceElement} is a syntactical entity and not - * necessary a {@link de.uka.ilkd.key.java.ModelElement}, such as a {@link de.uka.ilkd.key.java.Comment}. + * necessary a {@link de.uka.ilkd.key.java.ModelElement}, such as a + * {@link de.uka.ilkd.key.java.Comment}. *

* A {@link de.uka.ilkd.key.java.ProgramElement} is a {@link de.uka.ilkd.key.java.SourceElement} * and a {@link de.uka.ilkd.key.ModelElement}. It is aware of its parent in the syntax @@ -21,7 +22,8 @@ *

* {@link de.uka.ilkd.key.java.ProgramElement}s are further * classified into {@link de.uka.ilkd.key.java.TerminalProgramElement}s and - * {@link de.uka.ilkd.key.java.NonTerminalProgramElement}s. While {@link de.uka.ilkd.key.java.TerminalProgramElement} + * {@link de.uka.ilkd.key.java.NonTerminalProgramElement}s. While + * {@link de.uka.ilkd.key.java.TerminalProgramElement} * is just a tag class, {@link de.uka.ilkd.key.java.NonTerminalProgramElement}s know * their AST children (while it is possible that they do not have any). * A complete source file occurs as a {@link de.uka.ilkd.key.java.CompilationUnit}. @@ -56,7 +58,7 @@ * {@link de.uka.ilkd.key.java.StatementContainer}, * {@link de.uka.ilkd.key.java.ParameterContainer}, * {@link de.uka.ilkd.key.java.NamedProgramElement} and - * {@link de.uka.ilkd.key.java.reference.TypeReferenceContainer}. A + * {@link de.uka.ilkd.key.java.reference.TypeReferenceContainer}. A * An {@link de.uka.ilkd.key.java.ExpressionContainer} contains * {@link de.uka.ilkd.key.java.Expression}s, a * {@link de.uka.ilkd.key.java.StatementContainer} contains @@ -92,7 +94,7 @@ * {@link de.uka.ilkd.key.java.Declaration}s are either * declarations of types or other entities such as * {@link de.uka.ilkd.key.java.declaration.MemberDeclaration} or - * {@link de.uka.ilkd.key.java.declaration.VariableDeclaration}. Concrete + * {@link de.uka.ilkd.key.java.declaration.VariableDeclaration}. Concrete * {@link de.uka.ilkd.key.java.declaration.Modifier}s and * {@link de.uka.ilkd.key.java.Declaration}s are * bundled in the {@link de.uka.ilkd.key.java.declaration.modifier} and @@ -100,4 +102,4 @@ *

* */ -package de.uka.ilkd.key.java; \ No newline at end of file +package de.uka.ilkd.key.java; diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/recoderext/adt/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/recoderext/adt/package-info.java index 2a28f741f1..4ee9164bde 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/java/recoderext/adt/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/java/recoderext/adt/package-info.java @@ -1,5 +1,7 @@ /** - * This package contains RecodeR Operators - * which represent algebraic data type functions. (See also the ldt package description.) + * This package contains RecodeR Operators + * which represent algebraic data type functions. (See also the + * ldt package description.) */ -package de.uka.ilkd.key.java.recoderext.adt; \ No newline at end of file +package de.uka.ilkd.key.java.recoderext.adt; diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/reference/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/reference/package-info.java index 3d8cb9af65..7837159e93 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/java/reference/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/java/reference/package-info.java @@ -2,4 +2,4 @@ * Elements of the Java syntax tree representing implicit or explicit (named) * references to other program elements. */ -package de.uka.ilkd.key.java.reference; \ No newline at end of file +package de.uka.ilkd.key.java.reference; diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/statement/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/statement/package-info.java index 673dd6ba5e..c05a5d19b7 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/java/statement/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/java/statement/package-info.java @@ -3,4 +3,4 @@ * Besides these other valid statements are the various expressions with * side effects ({@link recoder.java.expression.ExpressionStatement}s). */ -package de.uka.ilkd.key.java.statement; \ No newline at end of file +package de.uka.ilkd.key.java.statement; diff --git a/key.core/src/main/java/de/uka/ilkd/key/java/visitor/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/java/visitor/package-info.java index 40c024d906..5e3aa139ac 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/java/visitor/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/java/visitor/package-info.java @@ -2,4 +2,4 @@ * contains classes representing visitors traversing the tree * structure of Java programs. */ -package de.uka.ilkd.key.java.visitor; \ No newline at end of file +package de.uka.ilkd.key.java.visitor; diff --git a/key.core/src/main/java/de/uka/ilkd/key/ldt/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/ldt/package-info.java index c009262e6c..4edf352157 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/ldt/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/ldt/package-info.java @@ -4,4 +4,4 @@ * programming interface to access the entities declared in these * rule files. */ -package de.uka.ilkd.key.ldt; \ No newline at end of file +package de.uka.ilkd.key.ldt; diff --git a/key.core/src/main/java/de/uka/ilkd/key/logic/op/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/logic/op/package-info.java index 2d10005e5e..7bbf6a3358 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/logic/op/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/logic/op/package-info.java @@ -17,4 +17,4 @@ * de.uka.ilkd.key.logic.op.SchemaVariable}s for {@link * de.uka.ilkd.key.rule.Taclet}s. */ -package de.uka.ilkd.key.logic.op; \ No newline at end of file +package de.uka.ilkd.key.logic.op; diff --git a/key.core/src/main/java/de/uka/ilkd/key/logic/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/logic/package-info.java index b0ab26c0d3..6b837c99a9 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/logic/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/logic/package-info.java @@ -1,5 +1,6 @@ /** - *

provides a representation for the term and sequent + *

+ * provides a representation for the term and sequent * structure. The structure of a term is defined in {@link * de.uka.ilkd.key.logic.Term}. Subclasses of {@link * de.uka.ilkd.key.logic.Term} provide representations for special @@ -9,26 +10,32 @@ * subclasses. Moreover, {@link de.uka.ilkd.key.logic.Term}s (or * their subclasses) are supposed to be never constructed by * constructors of their own, but by instances of {@link - * de.uka.ilkd.key.logic.TermFactory}.

- *

The function of {@link de.uka.ilkd.key.logic.Term}s (e.g., if + * de.uka.ilkd.key.logic.TermFactory}. + *

+ *

+ * The function of {@link de.uka.ilkd.key.logic.Term}s (e.g., if * they represent a conjunction of subterms, a quantified * formula,...) is only determined by an {@link * de.uka.ilkd.key.logic.op.Operator} that is assigned to a {@link * de.uka.ilkd.key.logic.Term} when the {@link - * de.uka.ilkd.key.logic.Term} is constructed.

- *

{@link de.uka.ilkd.key.logic.Sequent}s consist of two {@link + * de.uka.ilkd.key.logic.Term} is constructed. + *

+ *

+ * {@link de.uka.ilkd.key.logic.Sequent}s consist of two {@link * de.uka.ilkd.key.logic.Semisequent}s which represent a * duplicate-free list of a {@link * de.uka.ilkd.key.logic.SequentFormula}s. The latter consist of * a {@link de.uka.ilkd.key.logic.Constraint} and a {@link * de.uka.ilkd.key.logic.Term} of a special sort {@link - * de.uka.ilkd.key.logic.sort.Sort#FORMULA}.

- *

{@link de.uka.ilkd.key.logic.Sequent}s and {@link + * de.uka.ilkd.key.logic.sort.Sort#FORMULA}. + *

+ *

+ * {@link de.uka.ilkd.key.logic.Sequent}s and {@link * de.uka.ilkd.key.logic.Term}s are immutable. *

* * - * Last modified: Wed Dec 4 15:11:14 MET 2002 + * Last modified: Wed Dec 4 15:11:14 MET 2002 * */ -package de.uka.ilkd.key.logic; \ No newline at end of file +package de.uka.ilkd.key.logic; diff --git a/key.core/src/main/java/de/uka/ilkd/key/logic/sort/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/logic/sort/package-info.java index 5511d09c41..a4ff014668 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/logic/sort/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/logic/sort/package-info.java @@ -7,4 +7,4 @@ * In KeY we distinguish formulas from terms by the special sort instance * Sort.Formula. */ -package de.uka.ilkd.key.logic.sort; \ No newline at end of file +package de.uka.ilkd.key.logic.sort; diff --git a/key.core/src/main/java/de/uka/ilkd/key/pp/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/pp/package-info.java index 8cd2b762bb..8cfd6eb185 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/pp/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/pp/package-info.java @@ -2,4 +2,4 @@ * This package contains pretty-printing functionality used by the GUI and for * saving proofs. */ -package de.uka.ilkd.key.pp; \ No newline at end of file +package de.uka.ilkd.key.pp; diff --git a/key.core/src/main/java/de/uka/ilkd/key/proof/init/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/proof/init/package-info.java index 414abffbb7..fa3f28aca2 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/proof/init/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/proof/init/package-info.java @@ -4,4 +4,4 @@ * EnvInput (provides a proof environment) and ProofOblInput (provides one or many * sequents whose validity is to be proven). */ -package de.uka.ilkd.key.proof.init; \ No newline at end of file +package de.uka.ilkd.key.proof.init; diff --git a/key.core/src/main/java/de/uka/ilkd/key/proof/io/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/proof/io/package-info.java index 1276060d13..e558a3a92c 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/proof/io/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/proof/io/package-info.java @@ -1,4 +1,4 @@ /** * Classes related to loading and saving proof files. */ -package de.uka.ilkd.key.proof.io; \ No newline at end of file +package de.uka.ilkd.key.proof.io; diff --git a/key.core/src/main/java/de/uka/ilkd/key/proof/mgt/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/proof/mgt/package-info.java index 94a92e3a21..400e8b6226 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/proof/mgt/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/proof/mgt/package-info.java @@ -3,4 +3,4 @@ * example, proof management ensures that contract applications cannot lead to * unsound cyclic dependencies between proofs. */ -package de.uka.ilkd.key.proof.mgt; \ No newline at end of file +package de.uka.ilkd.key.proof.mgt; diff --git a/key.core/src/main/java/de/uka/ilkd/key/proof/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/proof/package-info.java index bbcf3c62f5..84a5861d0b 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/proof/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/proof/package-info.java @@ -2,4 +2,4 @@ * This package contains the core data structures of proofs, nodes, goals, as well * as machinery to deal with these data structures. */ -package de.uka.ilkd.key.proof; \ No newline at end of file +package de.uka.ilkd.key.proof; diff --git a/key.core/src/main/java/de/uka/ilkd/key/rule/inst/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/rule/inst/package-info.java index 1a0ec2117a..2303f184f3 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/rule/inst/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/rule/inst/package-info.java @@ -2,4 +2,4 @@ * contains classes for the instantiation of schema variables of {@link * de.uka.ilkd.key.rule.Taclet}s. */ -package de.uka.ilkd.key.rule.inst; \ No newline at end of file +package de.uka.ilkd.key.rule.inst; diff --git a/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/arith/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/arith/package-info.java index a13bae15f8..8c549dbd76 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/arith/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/arith/package-info.java @@ -1,5 +1,5 @@ /** - * contains classes representing the special meta constructs of {@link + * contains classes representing the special meta constructs of {@link * de.uka.ilkd.key.rule.Taclet}s performing arithmetic operations. */ -package de.uka.ilkd.key.rule.metaconstruct.arith; \ No newline at end of file +package de.uka.ilkd.key.rule.metaconstruct.arith; diff --git a/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/package-info.java index 753f96f9e5..c908c6a846 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/rule/metaconstruct/package-info.java @@ -1,5 +1,5 @@ /** - * contains classes representing the meta constructs of {@link + * contains classes representing the meta constructs of {@link * de.uka.ilkd.key.rule.Taclet}s. */ -package de.uka.ilkd.key.rule.metaconstruct; \ No newline at end of file +package de.uka.ilkd.key.rule.metaconstruct; diff --git a/key.core/src/main/java/de/uka/ilkd/key/rule/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/rule/package-info.java index 6e7df2eb20..f4f0fa03e5 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/rule/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/rule/package-info.java @@ -7,4 +7,4 @@ * de.uka.ilkd.key.rule.TacletBuilder}). Besides taclets, there are * built-in rules implemented directly in Java. */ -package de.uka.ilkd.key.rule; \ No newline at end of file +package de.uka.ilkd.key.rule; diff --git a/key.core/src/main/java/de/uka/ilkd/key/smt/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/smt/package-info.java index 5d7738b7b0..563f1bde8a 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/smt/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/smt/package-info.java @@ -3,4 +3,4 @@ * to formulas in formats such as SMT-LIB, and allowing to send such formulas to * SMT solvers such as Simplify or Z3. */ -package de.uka.ilkd.key.smt; \ No newline at end of file +package de.uka.ilkd.key.smt; diff --git a/key.core/src/main/java/de/uka/ilkd/key/speclang/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/speclang/package-info.java index 86674f8701..817a632f01 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/speclang/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/speclang/package-info.java @@ -5,4 +5,4 @@ * OperationContract, and DependencyContract. These are used as input by the * proof obligations declared in package proof.init. */ -package de.uka.ilkd.key.speclang; \ No newline at end of file +package de.uka.ilkd.key.speclang; diff --git a/key.core/src/main/java/de/uka/ilkd/key/strategy/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/strategy/package-info.java index 93c5d20544..3687946ff8 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/strategy/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/strategy/package-info.java @@ -1,4 +1,4 @@ /** * This package contains classes implementing the proof search strategies of KeY. */ -package de.uka.ilkd.key.strategy; \ No newline at end of file +package de.uka.ilkd.key.strategy; diff --git a/key.core/src/main/java/de/uka/ilkd/key/util/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/util/package-info.java index 6ca9c1ca0a..0ce8a09b6c 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/util/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/util/package-info.java @@ -3,4 +3,4 @@ * side functionalities like the installer (subpackage install), and the tool for * removing generics from a Java program (subpackage removegenerics). */ -package de.uka.ilkd.key.util; \ No newline at end of file +package de.uka.ilkd.key.util; diff --git a/key.core/src/main/java/de/uka/ilkd/key/util/pp/package-info.java b/key.core/src/main/java/de/uka/ilkd/key/util/pp/package-info.java index ac45015848..7362fb0d6c 100644 --- a/key.core/src/main/java/de/uka/ilkd/key/util/pp/package-info.java +++ b/key.core/src/main/java/de/uka/ilkd/key/util/pp/package-info.java @@ -1,20 +1,26 @@ /** * A package to pretty-print information using line breaks and - * indentation. For instance, it can be used to print + * indentation. For instance, it can be used to print + * *

- * while (i>0) {
- * i--;
- * j++;
+ * while (i > 0) {
+ *     i--;
+ *     j++;
  * }
  * 
+ * * instead of + * *
- * while (i>0) { i
- * --; j++;}
+ * while (i > 0) {
+ *     i--;
+ *     j++;
+ * }
  * 
- * if a maximum line width of 15 characters is chosen. The frontend + * + * if a maximum line width of 15 characters is chosen. The frontend * to the Pretty-Printer is the {@link - * de.uka.ilkd.key.util.pp.Layouter} class. You may configure what + * de.uka.ilkd.key.util.pp.Layouter} class. You may configure what * happens with the output by implemenenting the {@link * de.uka.ilkd.key.util.pp.Backend} interface, or by using the * standard implementation {@link @@ -22,4 +28,4 @@ * * @author Martin Giese */ -package de.uka.ilkd.key.util.pp; \ No newline at end of file +package de.uka.ilkd.key.util.pp; diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/configuration/package-info.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/configuration/package-info.java index 3e6b71238d..fc954e3169 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/configuration/package-info.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/configuration/package-info.java @@ -1,4 +1,4 @@ /** * This package contains classes to do with the configuration / settings of KeY. */ -package de.uka.ilkd.key.gui.configuration; \ No newline at end of file +package de.uka.ilkd.key.gui.configuration; diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/package-info.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/package-info.java index 9a0f762150..0b1a6c5be1 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/package-info.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/package-info.java @@ -1,4 +1,4 @@ /** * This package contains classes forming the graphical user interface of KeY. */ -package de.uka.ilkd.key.gui; \ No newline at end of file +package de.uka.ilkd.key.gui; diff --git a/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/package-info.java b/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/package-info.java index e9af4b204b..c235bf20f1 100644 --- a/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/package-info.java +++ b/key.ui/src/main/java/de/uka/ilkd/key/gui/smt/package-info.java @@ -1,4 +1,4 @@ /** * This package contains the graphical user interface of the SMT backend. */ -package de.uka.ilkd.key.gui.smt; \ No newline at end of file +package de.uka.ilkd.key.gui.smt; diff --git a/recoder/src/main/java/recoder/abstraction/package-info.java b/recoder/src/main/java/recoder/abstraction/package-info.java index e6735125ac..fb91fe0c4a 100644 --- a/recoder/src/main/java/recoder/abstraction/package-info.java +++ b/recoder/src/main/java/recoder/abstraction/package-info.java @@ -15,4 +15,4 @@ * {@link recoder.service.SourceInfo} implementations; the corresponding * methods should not be uses by others. */ -package recoder.abstraction; \ No newline at end of file +package recoder.abstraction; diff --git a/recoder/src/main/java/recoder/bytecode/package-info.java b/recoder/src/main/java/recoder/bytecode/package-info.java index b1c78d7885..77ca48f1b0 100644 --- a/recoder/src/main/java/recoder/bytecode/package-info.java +++ b/recoder/src/main/java/recoder/bytecode/package-info.java @@ -3,4 +3,4 @@ * code. As RECODER does not rewrite Bytecode, the information remains on * interface level - no statements are analyzed. */ -package recoder.bytecode; \ No newline at end of file +package recoder.bytecode; diff --git a/recoder/src/main/java/recoder/convenience/package-info.java b/recoder/src/main/java/recoder/convenience/package-info.java index af9b49f112..ce21961fb1 100644 --- a/recoder/src/main/java/recoder/convenience/package-info.java +++ b/recoder/src/main/java/recoder/convenience/package-info.java @@ -9,4 +9,4 @@ * artificial names. * */ -package recoder.convenience; \ No newline at end of file +package recoder.convenience; diff --git a/recoder/src/main/java/recoder/io/package-info.java b/recoder/src/main/java/recoder/io/package-info.java index 98e7604ae8..1bd2a975cd 100644 --- a/recoder/src/main/java/recoder/io/package-info.java +++ b/recoder/src/main/java/recoder/io/package-info.java @@ -3,4 +3,4 @@ * The abstractions hide where the information stems from or should go to, * e.g. files with various file formats, databases or graphical interfaces. */ -package recoder.io; \ No newline at end of file +package recoder.io; diff --git a/recoder/src/main/java/recoder/java/declaration/modifier/package-info.java b/recoder/src/main/java/recoder/java/declaration/modifier/package-info.java index ce1ef2e01d..8e17fc424c 100644 --- a/recoder/src/main/java/recoder/java/declaration/modifier/package-info.java +++ b/recoder/src/main/java/recoder/java/declaration/modifier/package-info.java @@ -3,4 +3,4 @@ * the parent {@link recoder.java.declaration.Modifier} is the * {@link recoder.java.declaration.modifier.VisibilityModifier}. */ -package recoder.java.declaration.modifier; \ No newline at end of file +package recoder.java.declaration.modifier; diff --git a/recoder/src/main/java/recoder/java/declaration/package-info.java b/recoder/src/main/java/recoder/java/declaration/package-info.java index d64a7973b1..79798178f1 100644 --- a/recoder/src/main/java/recoder/java/declaration/package-info.java +++ b/recoder/src/main/java/recoder/java/declaration/package-info.java @@ -8,4 +8,4 @@ * The modifiers themselves are collected in the subpackage * {@link recoder.java.declaration.modifier}. */ -package recoder.java.declaration; \ No newline at end of file +package recoder.java.declaration; diff --git a/recoder/src/main/java/recoder/java/expression/literal/package-info.java b/recoder/src/main/java/recoder/java/expression/literal/package-info.java index c87f527e51..b61f5aa36f 100644 --- a/recoder/src/main/java/recoder/java/expression/literal/package-info.java +++ b/recoder/src/main/java/recoder/java/expression/literal/package-info.java @@ -4,4 +4,4 @@ * {@link recoder.java.expression.literal.NullLiteral} and * {@link recoder.java.expression.literal.StringLiteral}. */ -package recoder.java.expression.literal; \ No newline at end of file +package recoder.java.expression.literal; diff --git a/recoder/src/main/java/recoder/java/expression/operator/package-info.java b/recoder/src/main/java/recoder/java/expression/operator/package-info.java index 13d009834f..14a4eec19c 100644 --- a/recoder/src/main/java/recoder/java/expression/operator/package-info.java +++ b/recoder/src/main/java/recoder/java/expression/operator/package-info.java @@ -4,4 +4,4 @@ * {@link recoder.java.expression.operator.New} is also considered an * operator ({@link recoder.java.expression.operator.TypeOperator}). */ -package recoder.java.expression.operator; \ No newline at end of file +package recoder.java.expression.operator; diff --git a/recoder/src/main/java/recoder/java/expression/package-info.java b/recoder/src/main/java/recoder/java/expression/package-info.java index 6e426b0b81..294b05e208 100644 --- a/recoder/src/main/java/recoder/java/expression/package-info.java +++ b/recoder/src/main/java/recoder/java/expression/package-info.java @@ -3,4 +3,4 @@ * The various operators and literals are bundled in the corresponding * subpackages. */ -package recoder.java.expression; \ No newline at end of file +package recoder.java.expression; diff --git a/recoder/src/main/java/recoder/java/package-info.java b/recoder/src/main/java/recoder/java/package-info.java index 3dfa4049ea..347300639a 100644 --- a/recoder/src/main/java/recoder/java/package-info.java +++ b/recoder/src/main/java/recoder/java/package-info.java @@ -132,4 +132,4 @@ * * */ -package recoder.java; \ No newline at end of file +package recoder.java; diff --git a/recoder/src/main/java/recoder/java/reference/package-info.java b/recoder/src/main/java/recoder/java/reference/package-info.java index e6e28b2b92..c5f707a592 100644 --- a/recoder/src/main/java/recoder/java/reference/package-info.java +++ b/recoder/src/main/java/recoder/java/reference/package-info.java @@ -2,4 +2,4 @@ * Elements of the Java syntax tree representing implicit or explicit (named) * references to other program elements. */ -package recoder.java.reference; \ No newline at end of file +package recoder.java.reference; diff --git a/recoder/src/main/java/recoder/java/statement/package-info.java b/recoder/src/main/java/recoder/java/statement/package-info.java index 02f3e72f3f..dc7ff53c31 100644 --- a/recoder/src/main/java/recoder/java/statement/package-info.java +++ b/recoder/src/main/java/recoder/java/statement/package-info.java @@ -3,4 +3,4 @@ * Besides these other valid statements are the various expressions with * side effects ({@link recoder.java.expression.ExpressionStatement}s). */ -package recoder.java.statement; \ No newline at end of file +package recoder.java.statement; diff --git a/recoder/src/main/java/recoder/kit/package-info.java b/recoder/src/main/java/recoder/kit/package-info.java index 8fc4ce19ab..16bea72feb 100644 --- a/recoder/src/main/java/recoder/kit/package-info.java +++ b/recoder/src/main/java/recoder/kit/package-info.java @@ -6,4 +6,4 @@ * possible problems; specialized problem reports are collected * in the {@link recoder.kit.transformation} package. */ -package recoder.kit; \ No newline at end of file +package recoder.kit; diff --git a/recoder/src/main/java/recoder/kit/pattern/package-info.java b/recoder/src/main/java/recoder/kit/pattern/package-info.java index a2059e6180..848c156a13 100644 --- a/recoder/src/main/java/recoder/kit/pattern/package-info.java +++ b/recoder/src/main/java/recoder/kit/pattern/package-info.java @@ -7,4 +7,4 @@ * generate certain pattern implementations and can check parts of their * contracts. */ -package recoder.kit.pattern; \ No newline at end of file +package recoder.kit.pattern; diff --git a/recoder/src/main/java/recoder/kit/transformation/package-info.java b/recoder/src/main/java/recoder/kit/transformation/package-info.java index 5b4929cf88..a4808e3001 100644 --- a/recoder/src/main/java/recoder/kit/transformation/package-info.java +++ b/recoder/src/main/java/recoder/kit/transformation/package-info.java @@ -2,4 +2,4 @@ * This package contains transformation command objects and * associated problem reports. */ -package recoder.kit.transformation; \ No newline at end of file +package recoder.kit.transformation; diff --git a/recoder/src/main/java/recoder/list/package-info.java b/recoder/src/main/java/recoder/list/package-info.java index 0df7a945a2..58e63c5c4c 100644 --- a/recoder/src/main/java/recoder/list/package-info.java +++ b/recoder/src/main/java/recoder/list/package-info.java @@ -40,4 +40,4 @@ * * */ -package recoder.list; \ No newline at end of file +package recoder.list; diff --git a/recoder/src/main/java/recoder/package-info.java b/recoder/src/main/java/recoder/package-info.java index 6cc1632a8c..1680ba7f99 100644 --- a/recoder/src/main/java/recoder/package-info.java +++ b/recoder/src/main/java/recoder/package-info.java @@ -14,4 +14,4 @@ * abstractions. * {@link recoder.ModelElement} is the parent of most other classes of the model. */ -package recoder; \ No newline at end of file +package recoder; diff --git a/recoder/src/main/java/recoder/parser/package-info.java b/recoder/src/main/java/recoder/parser/package-info.java index 22ef5987d2..8e69db2c46 100644 --- a/recoder/src/main/java/recoder/parser/package-info.java +++ b/recoder/src/main/java/recoder/parser/package-info.java @@ -3,4 +3,4 @@ * to be used directly; instead, the {@link recoder.ProgramFactory} defines * appropriate access methods. */ -package recoder.parser; \ No newline at end of file +package recoder.parser; diff --git a/recoder/src/main/java/recoder/service/package-info.java b/recoder/src/main/java/recoder/service/package-info.java index af9aca3d0b..cbf3e95da2 100644 --- a/recoder/src/main/java/recoder/service/package-info.java +++ b/recoder/src/main/java/recoder/service/package-info.java @@ -1,4 +1,4 @@ /** * This package contains the semantical services of RECODER. */ -package recoder.service; \ No newline at end of file +package recoder.service; diff --git a/recoder/src/main/java/recoder/util/package-info.java b/recoder/src/main/java/recoder/util/package-info.java index 4d83b9b12f..8ef178503f 100644 --- a/recoder/src/main/java/recoder/util/package-info.java +++ b/recoder/src/main/java/recoder/util/package-info.java @@ -5,4 +5,4 @@ * to create a hash table that uses object identity, the fixed "natural" * hash codes, or any other version. */ -package recoder.util; \ No newline at end of file +package recoder.util; From 4d0329a3a2dee445a4be59bd66756632330c2230 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jan 2024 20:54:05 +0000 Subject: [PATCH 63/66] Bump org.slf4j:slf4j-api from 2.0.9 to 2.0.10 Bumps org.slf4j:slf4j-api from 2.0.9 to 2.0.10. --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 3e777a2cb9..22b4f7937c 100644 --- a/build.gradle +++ b/build.gradle @@ -70,7 +70,7 @@ subprojects { } dependencies { - implementation("org.slf4j:slf4j-api:2.0.9") + implementation("org.slf4j:slf4j-api:2.0.10") testImplementation("ch.qos.logback:logback-classic:1.4.14") testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.1' From 6dae4833221ce16a6e88009f15d8a17b6d132c4a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jan 2024 20:52:11 +0000 Subject: [PATCH 64/66] Bump org.slf4j:slf4j-api from 2.0.10 to 2.0.11 Bumps org.slf4j:slf4j-api from 2.0.10 to 2.0.11. --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 22b4f7937c..fe74373139 100644 --- a/build.gradle +++ b/build.gradle @@ -70,7 +70,7 @@ subprojects { } dependencies { - implementation("org.slf4j:slf4j-api:2.0.10") + implementation("org.slf4j:slf4j-api:2.0.11") testImplementation("ch.qos.logback:logback-classic:1.4.14") testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.1' From 65bfc758d582bcc04edf33bce7d42cae820a6f7c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 20:47:00 +0000 Subject: [PATCH 65/66] Bump com.diffplug.spotless from 6.23.3 to 6.24.0 Bumps com.diffplug.spotless from 6.23.3 to 6.24.0. --- updated-dependencies: - dependency-name: com.diffplug.spotless dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index fe74373139..b0d1a7bb17 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ plugins { // id "com.github.ben-manes.versions" version "0.39.0" // Code formatting - id "com.diffplug.spotless" version "6.23.3" + id "com.diffplug.spotless" version "6.24.0" } // Configure this project for use inside IntelliJ: From 375ce5e9b237a1e7d6afe1b4db38281760d8add8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Jan 2024 20:57:52 +0000 Subject: [PATCH 66/66] Bump com.diffplug.spotless from 6.24.0 to 6.25.0 Bumps com.diffplug.spotless from 6.24.0 to 6.25.0. --- updated-dependencies: - dependency-name: com.diffplug.spotless dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b0d1a7bb17..873bf2fedd 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ plugins { // id "com.github.ben-manes.versions" version "0.39.0" // Code formatting - id "com.diffplug.spotless" version "6.24.0" + id "com.diffplug.spotless" version "6.25.0" } // Configure this project for use inside IntelliJ: