Compare commits

..
Author SHA1 Message Date
NoName11234 3b2e87ac48 fixed matrixk2 test 2024-05-23 18:31:48 +02:00
NoName11234 745607f651 fixed missing oderConstraints 2024-05-23 10:44:24 +02:00
NoName11234 048cdde838 small fixes for scalark3 test 2024-05-23 09:41:09 +02:00
NoName11234 7227041657 implemented scalark3 test 2024-05-23 09:33:40 +02:00
NoName11234 e2e0aead09 implemented scalark2test 2024-05-15 17:19:31 +02:00
80 changed files with 7478 additions and 7018 deletions

No files matched your search

-275
View File
@@ -1,275 +0,0 @@
# Fix for ASP Bug 1 — solutions could violate a placeholder's upper bounds
Fixes the bug logged as **Bug 1** in `../ASP_BUGS.md`. One rule was added to
`src/main/asp/unifyDiss.lp`; nothing else in the repository was changed.
---
## The bug
`unifyDiss.lp` could solve a placeholder with a type that violates that placeholder's own upper
bounds — most visibly `java.lang.Object`, which the S-Object rules add as an upper bound for
*every* placeholder.
Minimal reproduction, self-contained (no `gen-facts` run needed — this is exactly what
`gen-facts` emits for `_a <. java.lang.Boolean,` plus the one relevant `jdkHierarchy.lp` fact):
```prolog
% repro_bug1.lp
orCons(undCons(subcons(tph("_a"),type("java.lang.Boolean",null)), null), null).
subtype(type("java.lang.Boolean",null), type("java.lang.Object",null)).
```
```sh
clingo -n 0 repro_bug1.lp src/main/asp/unifyDiss.lp src/main/asp/show.lp
```
Before the fix — three answer sets, two of them wrong:
```
Answer: 1 sigma(tph("_a"),type("java.lang.Object",null))
Answer: 2 sigma(tph("_a"),type("java.lang.Boolean",null))
Answer: 3 sigma(tph("_a"),type("java.lang.Boolean",null)) sigma(tph("_a"),type("java.lang.Object",null))
```
`java.lang.Object` is not a subtype of `java.lang.Boolean`, so Answer 1 violates the only input
constraint — and since `pipeline.sh` runs `clingo -n 1`, that was the answer the pipeline used.
The or-constraint variant, where two placeholders must land on the *same* alternative:
```prolog
% repro_bug1b.lp
% { _a <. java.lang.Byte, _b <. java.lang.Byte | _a <. java.lang.Integer, _b <. java.lang.Integer }
orCons(undCons(subcons(tph("_b"),type("java.lang.Byte",null)),undCons(subcons(tph("_a"),type("java.lang.Byte",null)), null)),orCons(undCons(subcons(tph("_b"),type("java.lang.Integer",null)),undCons(subcons(tph("_a"),type("java.lang.Integer",null)), null)), null)).
subtype(type("java.lang.Byte",null), type("java.lang.Number",null)).
subtype(type("java.lang.Integer",null), type("java.lang.Number",null)).
subtype(type("java.lang.Number",null), type("java.lang.Object",null)).
```
Before the fix, 18 answer sets; the first was
`sigma(tph("_a"),…Integer) sigma(tph("_b"),…Object)` — `_b` outside both alternatives.
---
## Root cause
Not a missing check on the *solution*, but a missing check on the *constraints*.
Once `Solution-Gen` assigns a type to a placeholder, `subst` and the `subst-L` / `subst-R` rules
rewrite every constraint mentioning that placeholder into a constraint over the substituted
types. Inspecting the bad model shows the violated constraint is already sitting in it:
```
subst(tph("_a"), type("java.lang.Object",null)) % the chosen solution
subcons(tph("_a"), type("java.lang.Boolean",null)) % the input constraint
subcons(type("java.lang.Object",null), type("java.lang.Boolean",null)) % <- derived by subst-L
```
That last atom says `Object <. Boolean`. It contains no placeholders, so it is decidable against
the class hierarchy, and it is plainly false — but `unifyDiss.lp` had **no fail conditions at
all**, so nothing ever looked at it. The sibling encodings do have this check
(`unify.lp:118`, `unifyOrCons.lp:124`, `unifyPaper.lp:126`, all `% fail for adapt`);
`unifyDiss.lp` was missing that whole section.
### Matches the dissertation
`../dissertation/chapters/unifyWithASP.tex:723` defines the rule:
> **Fail-Subtype**: `G₁ <. G₂`, `G₁ ≮: G₂` ⟹ ∅
and line 867 states the ground-only restriction explicitly:
> *"**Fail-Subtype** rejects any stable model containing a ground subtype constraint `G₁ <. G₂`
> where `G₁ ≮: G₂` in the Java class hierarchy […] Crucially, both rules only apply to*
> ground *types `G` — types containing no placeholders. This is intentional: a constraint such as
> `Box<a> ≐ Box<b>` cannot be validated until `a` and `b` are assigned concrete types."*
Line 946 adds that this restriction is what `Solution-Requirement` exists for: every placeholder
must be assigned a type, otherwise a constraint could stay non-ground and dodge the check.
---
## The fix
Added to `src/main/asp/unifyDiss.lp`, directly after `Solution-Requirement`:
```prolog
:- subcons(S, T), groundType(S), groundType(T), not subtype(S, T).
groundType(T) :- typeTerm(T), not containsTph(T).
% + containsTph/1 (recursive over params/1..3) and typeTerm/1 (every type term occurring in a
% constraint, including those nested in type parameters)
```
Notes on the shape of the rule:
- **Ground-only is required for soundness, not an optimisation.** A constraint still containing a
placeholder is not yet decided and must remain satisfiable by a later substitution.
- **The subtype relation is not weakened.** The check uses `subtype/2` as-is, on whole type terms,
so a parameterized type still only conforms to a bound with the very same parameters. An
erasure-level variant (comparing class names only, as `unifyPaper.lp`'s `namedSubtype/2` does)
was deliberately *not* used, since it would let `Box<Integer>` satisfy a `Box<String>` bound.
- **The hierarchy must now be complete enough.** Because the check is only as good as `subtype/2`,
a type mentioned in no `subtype/2` fact at all has no derivable `T <: T` and its constraints
become unsatisfiable. Running `repro_bug1.lp` *without* `jdkHierarchy.lp` is UNSAT, where it
previously returned (wrong) answers. `pipeline.sh` always passes `jdkHierarchy.lp`, so this only
affects callers that invoke clingo directly — and failing loudly beats answering wrongly.
---
## Verification
### The reported cases
| Input | Before | After |
|---|---|---|
| `repro_bug1.lp` | 3 models, incl. `Object` and a double-`sigma` one | **1 model**, `java.lang.Boolean` |
| `repro_bug1b.lp` | 18 models, first one invalid | **2 models**: both `Byte`, or both `Integer` |
Both match the "Expected" in `../ASP_BUGS.md` exactly.
### Regression suite
All 37 `.java` files under
`../JavaConstraintGenerator/src/test/resources/java-samples/testinput/`, each run through
`gen-facts` and then `clingo -n 1 … unifyDiss.lp jdkHierarchy.lp show.lp`:
| | Before | After |
|---|---|---|
| SAT | 33 | 32 |
| UNSAT | 4 | 5 |
The 4 pre-existing UNSATs (3× `MethodReference`, 1× `TypeParameter`) are Bug 3 and are unchanged.
The one new UNSAT is `WholeProject/Matrix.java` — see below.
Seven samples (excluding Matrix) produce a different model. The real-world effects named in
`../ASP_BUGS.md` are fixed:
| Sample | Before | After |
|---|---|---|
| `ControlFlow/IfExample` | `_0 = Object` (javac rejects as `if` condition) | `_0 = Boolean` |
| `ControlFlow/WhileExample` | `_0 = Object` | `_0 = Boolean` |
| `EqualityExpression/EqualityIntInt` | `_0 = Byte`, `_1 = Object` (mixed alternatives) | both `Object` — one alternative |
| `EqualityExpression/EqualityBoolean` | `_0` had **two** sigmas (`Byte` *and* `Object`) | single sigma per placeholder |
| `RelationalExpression/RelationalIntInt` | `_0 = Double`, `_1 = Object` | both `Double` |
Note the fix constrains *validity*, not *minimality* — it removes invalid models but does not
make clingo prefer the tightest type. In `MethodCall/StringResultAsParameter` the first model
changed from `_0 = String` to `_0 = Object`; both are valid for that constraint set and the
solved file still compiles. The total number of `Object`-typed placeholders across the suite
barely moves (41 → 40, excluding Matrix); what changes is that the remaining ones are now
constraint-satisfying.
### End-to-end (`pipeline.sh`, javac before vs. after)
34 single-file samples: 25 compile after solving, 5 UNSAT, 3 negative fixtures that do not
compile before *or* after (`UnresolvableMethodReference`, `StaticImportUser`,
`UnresolvableQualifiedChain` — the latter two need their sibling files), and 1 regression
(`SimpleReturn`, below).
---
## Known fallout — two pre-existing defects the missing check was hiding
Both are outside Bug 1 and are **not** fixed here.
### 1. `WholeProject/Matrix.java` is now UNSAT
Its previous "solution" *was* the bug: nearly every placeholder solved as `java.lang.Object`,
including `_Matrix_7 <. java.lang.Boolean` solved as `Object`, plus a contradictory double-`sigma`
for `_Matrix_22`. It only ever looked like a success because the solution applier refuses to write
`java.lang.Object` into a source file.
The reason no valid solution exists: `Matrix extends Vector<Vector<Integer>>`, but the generator
emits the extends-relation **raw**, as `Matrix < java.util.Vector` (line 1 of its `.cons`). The
type argument is lost, so no `subtype(type("Matrix",null), type("java.util.Vector",params(…)))`
fact exists and the ground constraint `Matrix <. Vector<Object>` cannot be confirmed. Minimizing
the number of violated ground constraints gives an irreducible core of 3, all against the same
bound `java.util.Vector<java.lang.Object>`.
This is a `JavaConstraintGenerator` issue — the type argument never reaches the `.cons` file — and
is unaffected by how `JavaTypeUnifyASP` encodes extends relations (verified: the result is
identical either way).
### 2. `Return/SimpleReturn.java` — solved output no longer compiles
The new model is *valid for the constraint set given*: it selects the string-concatenation
alternative of the `+` or-constraint (`_0 <. String, Integer <. Integer, String <. _3`), yielding
`Integer compute(java.lang.String x)`, which javac rejects at `return y;`.
The constraint set is incomplete: `_SimpleReturn_3` has **no** upper bound at all. The method's
declared return type `Integer` stays literal rather than becoming a placeholder, and the generator
emits no `_SimpleReturn_3 <. java.lang.Integer` for `return y;`. (Contrast `Return/MultipleReturns`
and `Return/StringLiteralReturn`, where the return type *is* a placeholder and the returned value
flows in as a lower bound.) Previously the solver's invalid all-`Object` model happened to compile;
now a valid model exposes the missing constraint. Fixing this belongs in
`JavaConstraintGenerator`.
### Not a gap: `subtype/2` and parameterized types
While measuring the above, `_a <. java.util.Vector<java.lang.Integer>` appeared to go UNSAT under
Fail-Subtype, suggesting `subtype/2` could not relate parameterized types at all. That was an
artifact of an **uncommitted local change** to `ASPGenerator.generateExtendsRelations`, which
emitted each extends relation as a bare fact
```prolog
subtype(type("Box",params(XX)),type("java.lang.Object",null)). % unsafe variable XX
```
instead of the guarded rule the method originally produced:
```prolog
subtype(type("Box",params(XX)),type("java.lang.Object",null)) :- subtype(type("Box",params(XX))).
```
The guard is **not** self-referential: its head is `subtype/2` while its body is `subtype/**1**`,
a distinct predicate that `unifyDiss.lp:77` derives (`subtype(type(A, P)) :- subcons(type(A, P), _).`)
to mark "this type actually occurs in the constraints". The body is what *binds* `XX`, so the
guarded form is safe and instantiates the relation for the type arguments that really occur.
That local change has been reverted, restoring the committed behaviour. With the guarded form:
- `_a <. java.util.Vector<java.lang.Integer>` → exactly one model, `Vector<Integer>`. No
reflexivity rule is needed; `subtype(A,A) :- subtype(A,B).` fires once the guarded rule
instantiates `subtype(Vector<Integer>, Object)`.
- **Bug 4** of `../ASP_BUGS.md` (parameterized extends-relations producing `error: unsafe
variables`) no longer reproduces — it was caused by that local change.
- **Bug 3**'s input in the parameterized-extends form (`Box<X> < java.lang.Object`) now solves to
`sigma(tph("_a"), type("Box",params(type("java.lang.Integer",null))))`.
A reflexivity rule (`subtype(type(C,P), type(C,P)) :- typeTerm(type(C,P)).`) was prototyped
against the broken fact form and has been **reverted** — it is unnecessary.
Bug 3 as written in `../ASP_BUGS.md` (a *raw* `Box < java.lang.Object` declaration combined with a
parameterized `Box<java.lang.Integer>` use) is still UNSAT and remains open: the guard
`subtype(type("Box",null))` never holds, because the constraints only ever mention `Box<Integer>`.
`dissertation/chapters/unifyWithASP.tex:516` notes the intended relation coincides with
Featherweight Generic Java's.
---
## Reproducing this
```sh
cd JavaTypeUnifyASP
# the two minimal cases (paste the two .lp blocks above into files first)
clingo -n 0 repro_bug1.lp src/main/asp/unifyDiss.lp src/main/asp/show.lp
clingo -n 0 repro_bug1b.lp src/main/asp/unifyDiss.lp src/main/asp/show.lp
# a full sample, end to end
cd .. && ./pipeline.sh JavaConstraintGenerator/src/test/resources/java-samples/testinput/ControlFlow/IfExample.java
```
To see *which* ground constraints a model violates, turn the integrity constraint into an
observable atom:
```sh
sed 's/^ :- subcons(S, T), groundType(S), groundType(T), not subtype(S, T)\./violation(S,T) :- subcons(S, T), groundType(S), groundType(T), not subtype(S, T)./' \
src/main/asp/unifyDiss.lp > debug.lp
echo '#show violation/2.' > showv.lp
clingo -n 1 facts.lp debug.lp src/main/asp/jdkHierarchy.lp showv.lp
```
Adding `#minimize { 1, S, T : violation(S, T) }.` and `--opt-mode=optN` gives the irreducible set
of unsatisfiable ground constraints — that is how the `Matrix` core above was found.
-83
View File
@@ -1,83 +0,0 @@
# JavaTypeUnifyASP
Step ② of the pipeline: **typing constraints → a type assignment.** Takes the `.cons` file
[JavaConstraintGenerator](../ConstraintGeneration.md) produces, turns it into ASP facts, solves
them with [clingo](https://potassco.org/clingo/), and turns the answer set back into JSON.
See [../README.md](../README.md) for the whole flow and
[`src/main/asp/unifyFinal.lp`](src/main/asp/unifyFinal.lp) for the encoding, whose comments map
every rule to its counterpart in the dissertation.
## CLI
```sh
java -jar target/JavaTXcompiler-0.1-jar-with-dependencies.jar <subcommand> [args]
```
| Subcommand | Purpose |
| --- | --- |
| `gen-facts <in.cons> <out.lp>` | constraints → ASP facts |
| `cycle-check-facts <in.cons> <out.lp>` | facts for the cycle pre-check (below) |
| `gen-facts-pruned <in.cons> <brave-atoms.txt> <out.lp>` | as `gen-facts`, minus the alternatives the pre-check ruled out |
| `parse-solution <atoms.txt> <out.json>` | answer set → placeholder-name → type JSON |
## The cycle pre-check
A constraint set can force a type placeholder to equal a type that properly *contains* it — for
example `_r <. C<_p>` together with `_p <. _res <. _r`, which makes `_p =. C<_p>`. No finite type
satisfies that.
The encoding already says so: the *Anti Cycle Conditions* (Build / Connect / Fail-Cycle) exist for
exactly this case. But they are **integrity constraints**, and clingo evaluates those only once
grounding has finished — while on a cyclic set grounding is precisely what does not terminate.
Each *Subst-Param* firing nests a type one level deeper, and `maxdepth(5)` bounds the depth but
not the branching, so the ground program grows out of reach. The symptom is a hang with
`Rules: 0`, never an UNSAT. See [../ASP_BUGS.md](../ASP_BUGS.md), Bug 5.
So the check runs **before** the solve, in [`src/main/asp/cycleCheck.lp`](src/main/asp/cycleCheck.lp).
It builds no type terms at all — only a graph over placeholder identities — and therefore grounds
in milliseconds however deep the types in the constraint set are.
Two kinds of edge, and the distinction is the whole point:
| Edge | From | Meaning |
| --- | --- | --- |
| `containsEdge` | `_r <. C<_p>`, `_r =. C<_p>`, `C<_p> =. _r` | solving `_r` means solving `_p` *inside* it |
| `flowEdge` | `_p <. _res`, `_p =. _res` | `_p`'s type flows into `_res`'s |
A selection of or-constraint alternatives is **cyclic** iff its graph has a cycle through at least
one `containsEdge`. A cycle of flow edges alone (`_a <. _b <. _a`) is harmless — it just means the
two are the same type.
Because a cycle usually needs a particular *combination* of alternatives from *different*
or-constraints, the question is combinatorial, so clingo answers it — in one call:
```sh
clingo --enum-mode=brave cycle_facts.lp src/main/asp/cycleCheck.lp
```
- **UNSATISFIABLE** → no acyclic selection exists → the constraint set has no finite solution.
Report it and stop, instead of hanging.
- otherwise → the brave consequences (the *last* answer clingo prints, not the first) are exactly
the alternatives occurring in at least one acyclic selection. Anything absent belongs to no
solution, and `gen-facts-pruned` drops it.
Dropping is sound because every satisfiable selection is acyclic. Measured on a set with four
cyclic alternatives and one acyclic one:
| | outcome | ground rules | time |
| --- | --- | --- | --- |
| unpruned | never finishes grounding | 0 | > 65 s |
| pruned | SATISFIABLE | 265 | 4 ms |
`../pipeline.sh` runs this automatically as part of step 2.
**Caveat.** Sound only because F-bounded definitions (`class X extends C<X>`) are out of scope —
the dissertation excludes them where it argues that restricting substitution to placeholder-free
types preserves completeness. With an F-bounded class in the table, a type containing itself can
be legitimate and this check would reject a satisfiable set.
**Limitation.** Pruning removes an alternative only when it is cyclic in *every* selection. Where
cyclic and acyclic selections coexist and both remain reachable, grounding still explores the
cyclic ones. The corrected `connect` rule in `unifyFinal.lp` is the in-solver backstop for what
the pre-check cannot see.
+4 -3
View File
@@ -53,6 +53,7 @@ http://maven.apache.org/maven-v4_0_0.xsd">
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<compilerArgs>--enable-preview</compilerArgs>
<source>21</source>
<target>21</target>
</configuration>
@@ -76,7 +77,7 @@ http://maven.apache.org/maven-v4_0_0.xsd">
<configuration>
<archive>
<manifest>
<mainClass>de.dhbwstuttgart.Main</mainClass>
<mainClass>de.dhbwstuttgart.core.ConsoleInterface</mainClass>
</manifest>
</archive>
</configuration>
@@ -94,7 +95,7 @@ http://maven.apache.org/maven-v4_0_0.xsd">
<configuration>
<archive>
<manifest>
<mainClass>de.dhbwstuttgart.Main</mainClass>
<mainClass>de.dhbwstuttgart.core.ConsoleInterface</mainClass>
</manifest>
</archive>
<descriptorRefs>
@@ -113,7 +114,7 @@ http://maven.apache.org/maven-v4_0_0.xsd">
<properties>
<maven.compiler.source>19</maven.compiler.source>
<maven.compiler.target>19</maven.compiler.target>
<mainClass>de.dhbwstuttgart.Main</mainClass>
<mainClass>de.dhbwstuttgart.core.ConsoleInterface</mainClass>
</properties>
<distributionManagement>
<repository>
@@ -1,23 +0,0 @@
grammar ConstraintSet;
constraintSet : (constraints | orConstraint | extendsRelation | ',')+;
extendsRelation: IDENTIFIER typeParams? '<' type;
typeParams : '<' IDENTIFIER (',' IDENTIFIER)* '>';
orConstraint : '{' constraints ('|' constraints)* '}';
constraints : '{' constraint (','? constraint)* '}' | constraint (','? constraint)*;
constraint: subtypeCons | equalsCons;
subtypeCons : type '<.' type;
equalsCons : type '=.' type;
type : tph | namedType;
tph : '_' IDENTIFIER;
namedType : IDENTIFIER params?;
params : '<' type (',' type)* '>';
IDENTIFIER: [0-9A-Za-z.$[;][0-9A-Za-z.$[;_]*;
NEWLINE : [\r\n]+ -> skip;
WS: [ \t] -> skip ;
@@ -1,11 +0,0 @@
grammar Solution;
solutionset : solution (solution)*;
solution : 'sigma(' tph ',' type ')';
tph : 'tph("_' IDENTIFIER '")';
type : 'type("' IDENTIFIER '",' params ')';
params : 'null' | 'params(' type (',' type)* ')';
IDENTIFIER: [0-9A-Za-z.$[;][0-9A-Za-z.$[;_]*;
NEWLINE : [\r\n]+ -> skip;
WS: [ \t] -> skip ;
-51
View File
@@ -1,51 +0,0 @@
%==============================================================================================
% cycleCheck.lp - find or-constraint alternatives that can never be part of a solution because
% they force a type placeholder to equal a type properly containing itself.
%
% Run BEFORE the real solve, over facts from `gen-facts --cycle-check`:
%
% clingo --enum-mode=brave cycle-facts.lp cycleCheck.lp
%
% Brave enumeration returns the union of all answer sets, so the reported chosen/2 atoms are
% exactly the alternatives that appear in at least one ACYCLIC selection. Anything absent from
% that set is in no solution and can be dropped from the constraint set before solving.
% UNSATISFIABLE means no acyclic selection exists at all - the constraint set has no finite
% solution, and saying so here takes milliseconds.
%
% Why this is a separate program: the Anti Cycle Conditions in unifyFinal.lp express the same
% idea, but they are integrity constraints, and clingo evaluates those only once grounding has
% finished. On a cyclic set grounding never finishes (ASP_BUGS.md, Bug 5), so they never run.
% This program builds no type terms at all - only placeholder identities - so it grounds
% instantly no matter how deep the types in the constraint set are.
%
% CAVEAT: sound only because F-bounded definitions (class X extends C<X>) are out of scope. The
% dissertation excludes them explicitly where it argues that restricting substitution to
% placeholder-free types preserves completeness. With an F-bounded class in the table, a type
% that contains itself can be legitimate and this check would reject a satisfiable set.
%==============================================================================================
% --- Input, emitted by ASPGenerator.generateCycleCheckFacts ------------------------------------
% alt(O, A). or-constraint O has an alternative A
% containsEdge(O, A, P, Q). in alternative (O,A): P's own type must contain Q's
% e.g. "_r <. C1<_p1>" - solving _r means solving _p1 inside it
% flowEdge(O, A, P, Q). in alternative (O,A): P's type flows into Q's ("_p <. _res")
%
% A constraint that is not part of any or-constraint is emitted as an or-constraint with a
% single alternative, so it needs no special case: its edges are always present.
% Exactly one alternative per or-constraint - the same choice the real encoding makes.
{ chosen(O,A) : alt(O,A) } == 1 :- alt(O,_).
contains(P,Q) :- containsEdge(O,A,P,Q), chosen(O,A).
edge(P,Q) :- contains(P,Q).
edge(P,Q) :- flowEdge(O,A,P,Q), chosen(O,A).
reach(X,Y) :- edge(X,Y).
reach(X,Z) :- reach(X,Y), edge(Y,Z).
% A cycle is only fatal if it passes through at least one containment edge: that is what forces
% a placeholder to sit strictly inside its own type. A cycle of flow edges alone
% ("_a <. _b, _b <. _a") is harmless - it just means the two are the same type.
:- contains(X,Y), reach(Y,X).
#show chosen/2.
-29
View File
@@ -1,29 +0,0 @@
% Base subtype/2 facts for a small, common subset of java.lang.
%
% unifyDiss.lp's reflexive/transitive rules (subtype(B,B), subtype(A,A), subtype(A,C) :-
% subtype(A,B), subtype(B,C)) only propagate subtype/2 facts that already exist - they never
% originate one. ASPGenerator only emits subtype facts for user-defined `extends` relations
% found in the .cons input (see ConstraintSet.g4's extendsRelation rule), not for built-in JDK
% types. Without *some* subtype/2 base facts, any "concreteType <. placeholder" constraint (a
% concrete type flowing in as a lower bound) is unsatisfiable: unifyDiss.lp's "super" choice rule
% (line 88, "{ equalcons(tph(A), type(D, DP)) : subtype(type(C, CP), type(D, DP)) } == 1") must
% pick exactly one candidate supertype D for the placeholder, and with zero subtype facts that
% choice set is always empty.
%
% This is NOT a reflection of the full JDK class hierarchy - just the boxed numeric types, their
% common ancestor Number, and Object/Boolean/Character/String - enough to make ordinary literals,
% operators (`+`, comparisons, ...), and string concatenation resolvable. Extend as needed for
% other library types your input code touches; a fuller version of this would enumerate the real
% classpath (e.g. via reflection) rather than being hand-written.
subtype(type("java.lang.Byte",null), type("java.lang.Number",null)).
subtype(type("java.lang.Short",null), type("java.lang.Number",null)).
subtype(type("java.lang.Integer",null), type("java.lang.Number",null)).
subtype(type("java.lang.Long",null), type("java.lang.Number",null)).
subtype(type("java.lang.Float",null), type("java.lang.Number",null)).
subtype(type("java.lang.Double",null), type("java.lang.Number",null)).
subtype(type("java.lang.Number",null), type("java.lang.Object",null)).
subtype(type("java.lang.Boolean",null), type("java.lang.Object",null)).
subtype(type("java.lang.Character",null), type("java.lang.Object",null)).
subtype(type("java.lang.String",null), type("java.lang.Object",null)).
-1
View File
@@ -1 +0,0 @@
#show sigma/2.
-41
View File
@@ -1,41 +0,0 @@
% TEST INPUT
orCons(undCons(subcons(tph("_BG"),type("java.lang.Number",null)),undCons(equalcons(tph("_BE"),type("java.lang.Boolean",null)),undCons(equalcons(type("java.lang.Boolean",null),tph("_AH")),undCons(subcons(tph("_BC"),type("java.lang.Number",null)),undCons(subcons(tph("_G"),type("java.lang.Integer",null)),undCons(subcons(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_AS")),undCons(equalcons(type("java.lang.Boolean",null),tph("_H")),undCons(subcons(tph("_AP"),tph("_AM")),undCons(subcons(tph("_AV"),tph("_AU")),undCons(equalcons(tph("_AI"),type("Matrix",null)),undCons(subcons(tph("_AD"),tph("_AB")),undCons(subcons(type("Matrix",null),tph("_AD")),undCons(subcons(tph("_AF"),type("java.lang.Number",null)),undCons(equalcons(tph("_AU"),tph("_CD")),undCons(equalcons(tph("_H"),type("java.lang.Boolean",null)),undCons(subcons(tph("_BV"),tph("_BA")),undCons(subcons(tph("_V"),type("java.lang.Integer",null)),undCons(subcons(tph("_J"),type("java.lang.Number",null)),undCons(subcons(tph("_AY"),type("java.lang.Number",null)),undCons(equalcons(tph("_AH"),type("java.lang.Boolean",null)),undCons(equalcons(type("java.lang.Boolean",null),tph("_BE")),undCons(equalcons(tph("_AF"),tph("_CK")),undCons(equalcons(type("java.lang.Boolean",null),tph("_AW")),undCons(subcons(tph("_AU"),type("java.lang.Number",null)),undCons(subcons(tph("_BD"),tph("_BC")),undCons(equalcons(tph("_AW"),type("java.lang.Boolean",null)),undCons(subcons(tph("_BB"),tph("_BA")),undCons(subcons(tph("_AG"),tph("_AF")),undCons(equalcons(tph("_S"),type("Matrix",null)),undCons(equalcons(type("java.util.Vector",params(type("java.util.Vector",params(type("java.lang.Integer",null))))),type("java.util.Vector",params(tph("_ANQ")))),undCons(subcons(type("java.lang.Integer",null),type("java.lang.Number",null)),undCons(equalcons(type("java.util.Vector",params(type("java.util.Vector",params(type("java.lang.Integer",null))))),type("java.util.Vector",params(tph("_ANR")))),undCons(equalcons(tph("_BC"),tph("_BW")),undCons(equalcons(tph("_AQ"),type("Matrix",null)),undCons(subcons(tph("_AK"),type("java.lang.Number",null)), null))))))))))))))))))))))))))))))))))), null).
orCons(undCons(equalcons(tph("_AE"),type("Matrix",null)),undCons(subcons(type("Matrix",null),type("Matrix",null)), null)), null).
orCons(undCons(equalcons(tph("_AG"),type("java.lang.Integer",null)), null), null).
orCons(undCons(equalcons(tph("_AI"),type("java.util.AbstractList",params(tph("_AMV")))),undCons(subcons(type("java.lang.Integer",null),tph("_AK")), null)),orCons(undCons(equalcons(tph("_AI"),type("Matrix",null)),undCons(subcons(type("java.lang.Integer",null),tph("_AK")), null)),orCons(undCons(subcons(type("java.lang.Integer",null),tph("_AK")),undCons(equalcons(tph("_AI"),type("java.util.List",params(tph("_AMU")))), null)),orCons(undCons(equalcons(tph("_AI"),type("java.util.AbstractList",params(tph("_AMV")))),undCons(subcons(type("java.lang.Integer",null),tph("_AK")), null)),orCons(undCons(subcons(type("java.lang.Integer",null),tph("_AK")),undCons(equalcons(tph("_AI"),type("java.util.Vector",params(tph("_AMW")))), null)),orCons(undCons(equalcons(tph("_AI"),type("java.util.List",params(tph("_AMU")))),undCons(subcons(type("java.lang.Integer",null),tph("_AK")), null)),orCons(undCons(subcons(type("java.lang.Integer",null),tph("_AK")),undCons(equalcons(tph("_AI"),type("java.util.Vector",params(tph("_AMW")))), null)),orCons(undCons(equalcons(tph("_AI"),type("Matrix",null)),undCons(subcons(type("java.lang.Integer",null),tph("_AK")), null)), null)))))))).
orCons(undCons(subcons(tph("_AF"),type("java.lang.Integer",null)),undCons(equalcons(tph("_AQ"),type("java.util.Vector",params(tph("_AMX")))),undCons(subcons(tph("_AMX"),tph("_AP")), null))),orCons(undCons(subcons(tph("_AF"),type("java.lang.Integer",null)),undCons(equalcons(tph("_AQ"),type("Matrix",null)),undCons(subcons(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_AP")), null))),orCons(undCons(subcons(tph("_AF"),type("java.lang.Integer",null)),undCons(equalcons(tph("_AQ"),type("java.util.Vector",params(tph("_AMX")))),undCons(subcons(tph("_AMX"),tph("_AP")), null))),orCons(undCons(subcons(tph("_AF"),type("java.lang.Integer",null)),undCons(equalcons(tph("_AQ"),type("Matrix",null)),undCons(subcons(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_AP")), null))), null)))).
orCons(undCons(subcons(type("java.util.Vector",params(tph("_AMY"))),type("java.util.Vector",params(type("java.lang.Integer",null)))),undCons(equalcons(tph("_AT"),type("java.util.Vector",params(type("GE",null)))), null)), null).
orCons(undCons(equalcons(tph("_AV"),type("java.lang.Integer",null)), null), null).
orCons(undCons(subcons(type("java.lang.Integer",null),tph("_AY")),undCons(equalcons(tph("_AM"),type("Matrix",null)), null)),orCons(undCons(subcons(type("java.lang.Integer",null),tph("_AY")),undCons(equalcons(tph("_AM"),type("java.util.List",params(tph("_AMZ")))), null)),orCons(undCons(subcons(type("java.lang.Integer",null),tph("_AY")),undCons(equalcons(tph("_AM"),type("java.util.Vector",params(tph("_ANB")))), null)),orCons(undCons(subcons(type("java.lang.Integer",null),tph("_AY")),undCons(equalcons(tph("_AM"),type("java.util.List",params(tph("_AMZ")))), null)),orCons(undCons(subcons(type("java.lang.Integer",null),tph("_AY")),undCons(equalcons(tph("_AM"),type("java.util.AbstractList",params(tph("_ANA")))), null)),orCons(undCons(subcons(type("java.lang.Integer",null),tph("_AY")),undCons(equalcons(tph("_AM"),type("java.util.AbstractList",params(tph("_ANA")))), null)),orCons(undCons(subcons(type("java.lang.Integer",null),tph("_AY")),undCons(equalcons(tph("_AM"),type("Matrix",null)), null)),orCons(undCons(subcons(type("java.lang.Integer",null),tph("_AY")),undCons(equalcons(tph("_AM"),type("java.util.Vector",params(tph("_ANB")))), null)), null)))))))).
orCons(undCons(equalcons(tph("_BB"),type("java.lang.Integer",null)), null), null).
orCons(undCons(equalcons(tph("_BD"),type("java.lang.Integer",null)), null), null).
orCons(undCons(equalcons(tph("_AM"),type("java.util.Vector",params(tph("_ANE")))),undCons(subcons(type("java.lang.Integer",null),tph("_BG")), null)),orCons(undCons(subcons(type("java.lang.Integer",null),tph("_BG")),undCons(equalcons(tph("_AM"),type("Matrix",null)), null)),orCons(undCons(equalcons(tph("_AM"),type("java.util.Vector",params(tph("_ANE")))),undCons(subcons(type("java.lang.Integer",null),tph("_BG")), null)),orCons(undCons(subcons(type("java.lang.Integer",null),tph("_BG")),undCons(equalcons(tph("_AM"),type("java.util.AbstractList",params(tph("_AND")))), null)),orCons(undCons(subcons(type("java.lang.Integer",null),tph("_BG")),undCons(equalcons(tph("_AM"),type("Matrix",null)), null)),orCons(undCons(equalcons(tph("_AM"),type("java.util.List",params(tph("_ANC")))),undCons(subcons(type("java.lang.Integer",null),tph("_BG")), null)),orCons(undCons(equalcons(tph("_AM"),type("java.util.List",params(tph("_ANC")))),undCons(subcons(type("java.lang.Integer",null),tph("_BG")), null)),orCons(undCons(subcons(type("java.lang.Integer",null),tph("_BG")),undCons(equalcons(tph("_AM"),type("java.util.AbstractList",params(tph("_AND")))), null)), null)))))))).
orCons(undCons(subcons(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_BK")),undCons(subcons(tph("_BC"),type("java.lang.Integer",null)),undCons(equalcons(tph("_AM"),type("Matrix",null)), null))),orCons(undCons(subcons(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_BK")),undCons(subcons(tph("_BC"),type("java.lang.Integer",null)),undCons(equalcons(tph("_AM"),type("Matrix",null)), null))),orCons(undCons(subcons(tph("_BC"),type("java.lang.Integer",null)),undCons(subcons(tph("_ANG"),tph("_BK")),undCons(equalcons(tph("_AM"),type("java.util.AbstractList",params(tph("_ANG")))), null))),orCons(undCons(subcons(tph("_BC"),type("java.lang.Integer",null)),undCons(equalcons(tph("_AM"),type("java.util.Vector",params(tph("_ANH")))),undCons(subcons(tph("_ANH"),tph("_BK")), null))),orCons(undCons(subcons(tph("_BC"),type("java.lang.Integer",null)),undCons(subcons(tph("_ANG"),tph("_BK")),undCons(equalcons(tph("_AM"),type("java.util.AbstractList",params(tph("_ANG")))), null))),orCons(undCons(subcons(tph("_ANF"),tph("_BK")),undCons(subcons(tph("_BC"),type("java.lang.Integer",null)),undCons(equalcons(tph("_AM"),type("java.util.List",params(tph("_ANF")))), null))),orCons(undCons(subcons(tph("_ANF"),tph("_BK")),undCons(subcons(tph("_BC"),type("java.lang.Integer",null)),undCons(equalcons(tph("_AM"),type("java.util.List",params(tph("_ANF")))), null))),orCons(undCons(subcons(tph("_BC"),type("java.lang.Integer",null)),undCons(subcons(tph("_ANH"),tph("_BK")),undCons(equalcons(tph("_AM"),type("java.util.Vector",params(tph("_ANH")))), null))), null)))))))).
orCons(undCons(subcons(tph("_BC"),type("java.lang.Integer",null)),undCons(subcons(tph("_ANI"),tph("_BR")),undCons(equalcons(tph("_AC"),type("java.util.List",params(tph("_ANI")))), null))),orCons(undCons(subcons(tph("_BC"),type("java.lang.Integer",null)),undCons(equalcons(tph("_AC"),type("Matrix",null)),undCons(subcons(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_BR")), null))),orCons(undCons(subcons(tph("_BC"),type("java.lang.Integer",null)),undCons(equalcons(tph("_AC"),type("Matrix",null)),undCons(subcons(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_BR")), null))),orCons(undCons(subcons(tph("_BC"),type("java.lang.Integer",null)),undCons(subcons(tph("_ANJ"),tph("_BR")),undCons(equalcons(tph("_AC"),type("java.util.AbstractList",params(tph("_ANJ")))), null))),orCons(undCons(equalcons(tph("_AC"),type("java.util.Vector",params(tph("_ANK")))),undCons(subcons(tph("_BC"),type("java.lang.Integer",null)),undCons(subcons(tph("_ANK"),tph("_BR")), null))),orCons(undCons(equalcons(tph("_AC"),type("java.util.Vector",params(tph("_ANK")))),undCons(subcons(tph("_BC"),type("java.lang.Integer",null)),undCons(subcons(tph("_ANK"),tph("_BR")), null))),orCons(undCons(subcons(tph("_BC"),type("java.lang.Integer",null)),undCons(subcons(tph("_ANI"),tph("_BR")),undCons(equalcons(tph("_AC"),type("java.util.List",params(tph("_ANI")))), null))),orCons(undCons(subcons(tph("_BC"),type("java.lang.Integer",null)),undCons(subcons(tph("_ANJ"),tph("_BR")),undCons(equalcons(tph("_AC"),type("java.util.AbstractList",params(tph("_ANJ")))), null))), null)))))))).
orCons(undCons(subcons(tph("_ANM"),tph("_BO")),undCons(equalcons(tph("_BR"),type("java.util.AbstractList",params(tph("_ANM")))),undCons(subcons(tph("_AU"),type("java.lang.Integer",null)), null))),orCons(undCons(subcons(tph("_AU"),type("java.lang.Integer",null)),undCons(equalcons(tph("_BR"),type("Matrix",null)),undCons(subcons(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_BO")), null))),orCons(undCons(equalcons(tph("_BR"),type("java.util.List",params(tph("_ANL")))),undCons(subcons(tph("_ANL"),tph("_BO")),undCons(subcons(tph("_AU"),type("java.lang.Integer",null)), null))),orCons(undCons(equalcons(tph("_BR"),type("java.util.List",params(tph("_ANL")))),undCons(subcons(tph("_ANL"),tph("_BO")),undCons(subcons(tph("_AU"),type("java.lang.Integer",null)), null))),orCons(undCons(subcons(tph("_ANN"),tph("_BO")),undCons(equalcons(tph("_BR"),type("java.util.Vector",params(tph("_ANN")))),undCons(subcons(tph("_AU"),type("java.lang.Integer",null)), null))),orCons(undCons(subcons(tph("_ANM"),tph("_BO")),undCons(equalcons(tph("_BR"),type("java.util.AbstractList",params(tph("_ANM")))),undCons(subcons(tph("_AU"),type("java.lang.Integer",null)), null))),orCons(undCons(subcons(tph("_ANN"),tph("_BO")),undCons(equalcons(tph("_BR"),type("java.util.Vector",params(tph("_ANN")))),undCons(subcons(tph("_AU"),type("java.lang.Integer",null)), null))),orCons(undCons(subcons(tph("_AU"),type("java.lang.Integer",null)),undCons(equalcons(tph("_BR"),type("Matrix",null)),undCons(subcons(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_BO")), null))), null)))))))).
orCons(undCons(subcons(tph("_BO"),type("java.lang.Integer",null)),undCons(equalcons(type("java.lang.Integer",null),tph("_BU")),undCons(subcons(tph("_BK"),type("java.lang.Integer",null)), null))), null).
orCons(undCons(subcons(tph("_BU"),type("java.lang.Integer",null)),undCons(subcons(tph("_BA"),type("java.lang.Integer",null)),undCons(equalcons(type("java.lang.Integer",null),tph("_BV")), null))), null).
orCons(undCons(subcons(tph("_BA"),type("java.util.Vector",params(type("java.lang.Integer",null)))),undCons(equalcons(tph("_AS"),type("Matrix",null)), null)),orCons(undCons(subcons(tph("_BA"),type("java.util.Vector",params(type("java.lang.Integer",null)))),undCons(equalcons(tph("_AS"),type("Matrix",null)), null)),orCons(undCons(equalcons(tph("_AS"),type("java.util.Vector",params(tph("_ANO")))),undCons(subcons(tph("_BA"),tph("_ANO")), null)),orCons(undCons(equalcons(tph("_AS"),type("java.util.Vector",params(tph("_ANO")))),undCons(subcons(tph("_BA"),tph("_ANO")), null)), null)))).
orCons(undCons(subcons(tph("_AS"),type("java.util.Vector",params(type("java.lang.Integer",null)))),undCons(equalcons(tph("_AD"),type("Matrix",null)), null)),orCons(undCons(equalcons(tph("_AD"),type("java.util.Vector",params(tph("_ANP")))),undCons(subcons(tph("_AS"),tph("_ANP")), null)),orCons(undCons(subcons(tph("_AS"),type("java.util.Vector",params(type("java.lang.Integer",null)))),undCons(equalcons(tph("_AD"),type("Matrix",null)), null)),orCons(undCons(equalcons(tph("_AD"),type("java.util.Vector",params(tph("_ANP")))),undCons(subcons(tph("_AS"),tph("_ANP")), null)), null)))).
orCons(undCons(equalcons(tph("_G"),type("java.lang.Integer",null)), null), null).
orCons(undCons(subcons(type("java.lang.Integer",null),tph("_J")),undCons(equalcons(tph("_F"),type("java.util.List",params(tph("_ANS")))), null)),orCons(undCons(equalcons(tph("_F"),type("java.util.AbstractList",params(tph("_ANT")))),undCons(subcons(type("java.lang.Integer",null),tph("_J")), null)),orCons(undCons(subcons(type("java.lang.Integer",null),tph("_J")),undCons(equalcons(tph("_F"),type("java.util.Vector",params(tph("_ANU")))), null)),orCons(undCons(equalcons(tph("_F"),type("Matrix",null)),undCons(subcons(type("java.lang.Integer",null),tph("_J")), null)),orCons(undCons(equalcons(tph("_F"),type("Matrix",null)),undCons(subcons(type("java.lang.Integer",null),tph("_J")), null)),orCons(undCons(subcons(type("java.lang.Integer",null),tph("_J")),undCons(equalcons(tph("_F"),type("java.util.List",params(tph("_ANS")))), null)),orCons(undCons(subcons(type("java.lang.Integer",null),tph("_J")),undCons(equalcons(tph("_F"),type("java.util.Vector",params(tph("_ANU")))), null)),orCons(undCons(equalcons(tph("_F"),type("java.util.AbstractList",params(tph("_ANT")))),undCons(subcons(type("java.lang.Integer",null),tph("_J")), null)), null)))))))).
orCons(undCons(subcons(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(subcons(tph("_ANV"),tph("_N")),undCons(equalcons(tph("_F"),type("java.util.Vector",params(tph("_ANV")))), null))),orCons(undCons(equalcons(tph("_F"),type("Matrix",null)),undCons(subcons(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(subcons(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_N")), null))),orCons(undCons(subcons(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(subcons(tph("_ANV"),tph("_N")),undCons(equalcons(tph("_F"),type("java.util.Vector",params(tph("_ANV")))), null))),orCons(undCons(equalcons(tph("_F"),type("Matrix",null)),undCons(subcons(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(subcons(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_N")), null))), null)))).
orCons(undCons(equalcons(tph("_F"),type("Matrix",null)),undCons(subcons(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(subcons(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_N")), null))),orCons(undCons(equalcons(tph("_F"),type("java.util.Vector",params(tph("_ANX")))),undCons(subcons(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(subcons(tph("_ANX"),tph("_N")), null))),orCons(undCons(equalcons(tph("_F"),type("java.util.Vector",params(tph("_ANX")))),undCons(subcons(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(subcons(tph("_ANX"),tph("_N")), null))),orCons(undCons(equalcons(tph("_F"),type("Matrix",null)),undCons(subcons(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(subcons(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_N")), null))), null)))).
orCons(undCons(equalcons(tph("_F"),type("Matrix",null)),undCons(subcons(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(subcons(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_N")), null))),orCons(undCons(subcons(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(equalcons(tph("_F"),type("Matrix",null)),undCons(subcons(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_N")), null))),orCons(undCons(equalcons(tph("_F"),type("java.util.Vector",params(tph("_ANZ")))),undCons(subcons(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(subcons(tph("_ANZ"),tph("_N")), null))),orCons(undCons(equalcons(tph("_F"),type("java.util.Vector",params(tph("_ANZ")))),undCons(subcons(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(subcons(tph("_ANZ"),tph("_N")), null))), null)))).
orCons(undCons(equalcons(tph("_F"),type("Matrix",null)),undCons(subcons(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(subcons(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_N")), null))),orCons(undCons(subcons(tph("_AOB"),tph("_N")),undCons(subcons(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(equalcons(tph("_F"),type("java.util.Vector",params(tph("_AOB")))), null))),orCons(undCons(subcons(tph("_AOB"),tph("_N")),undCons(subcons(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(equalcons(tph("_F"),type("java.util.Vector",params(tph("_AOB")))), null))),orCons(undCons(subcons(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(equalcons(tph("_F"),type("Matrix",null)),undCons(subcons(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_N")), null))), null)))).
orCons(undCons(subcons(type("java.lang.Boolean",null),tph("_R")),undCons(subcons(tph("_N"),tph("_AOA")),undCons(equalcons(tph("_S"),type("java.util.Vector",params(tph("_AOA")))), null))),orCons(undCons(subcons(type("java.lang.Boolean",null),tph("_R")),undCons(subcons(tph("_N"),tph("_ANW")),undCons(equalcons(tph("_S"),type("java.util.List",params(tph("_ANW")))), null))),orCons(undCons(subcons(type("java.lang.Boolean",null),tph("_R")),undCons(subcons(tph("_N"),tph("_ANW")),undCons(equalcons(tph("_S"),type("java.util.List",params(tph("_ANW")))), null))),orCons(undCons(subcons(type("java.lang.Boolean",null),tph("_R")),undCons(subcons(tph("_N"),tph("_AOA")),undCons(equalcons(tph("_S"),type("java.util.Vector",params(tph("_AOA")))), null))),orCons(undCons(subcons(type("java.lang.Boolean",null),tph("_R")),undCons(equalcons(tph("_S"),type("Matrix",null)),undCons(subcons(tph("_N"),type("java.util.Vector",params(type("java.lang.Integer",null)))), null))),orCons(undCons(subcons(type("java.lang.Boolean",null),tph("_R")),undCons(equalcons(tph("_S"),type("Matrix",null)),undCons(subcons(tph("_N"),type("java.util.Vector",params(type("java.lang.Integer",null)))), null))),orCons(undCons(subcons(type("java.lang.Boolean",null),tph("_R")),undCons(equalcons(tph("_S"),type("java.util.AbstractList",params(tph("_ANY")))),undCons(subcons(tph("_N"),tph("_ANY")), null))),orCons(undCons(subcons(type("java.lang.Boolean",null),tph("_R")),undCons(equalcons(tph("_S"),type("java.util.AbstractList",params(tph("_ANY")))),undCons(subcons(tph("_N"),tph("_ANY")), null))), null)))))))).
orCons(undCons(equalcons(tph("_U"),type("java.lang.Integer",null)), null), null).
orCons(undCons(subcons(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(subcons(tph("_U"),type("java.lang.Integer",null)),undCons(equalcons(type("java.lang.Integer",null),tph("_V")), null))), null).
subtype(type("java.lang.Boolean",null),type("java.lang.Object",null)):-subtype(type("java.lang.Boolean",null)).subtype(type("java.lang.Integer",null),type("java.lang.Number",null)):-subtype(type("java.lang.Integer",null)).subtype(type("java.lang.Number",null),type("java.lang.Object",null)):-subtype(type("java.lang.Number",null)).
subtype(type("java.util.Vector",params(XX)),type("java.lang.Object",null)):-subtype(type("java.util.Vector",params(XX))).
subtype(type("Matrix",null),type("java.util.Vector",params(type("java.util.Vector",params(type("java.lang.Integer",null)))))):-subtype(type("Matrix",null)).
subtype(type("java.lang.Boolean",null),type("java.lang.Object",null)):-subtype(type("java.lang.Boolean",null)).subtype(type("java.lang.Integer",null),type("java.lang.Number",null)):-subtype(type("java.lang.Integer",null)).subtype(type("java.lang.Number",null),type("java.lang.Object",null)):-subtype(type("java.lang.Number",null)).subtype(type("java.util.Vector",params(XX)),type("java.lang.Object",null)):-subtype(type("java.util.Vector",params(XX))).subtype(type("Matrix",null),type("java.util.Vector",params(type("java.util.Vector",params(type("java.lang.Integer",null)))))):-subtype(type("Matrix",null)).
subtype(type("C1",null),type("java.lang.Object",null)):-subtype(type("C1",null)).
subtype(type("C2",null),type("java.lang.Object",null)):-subtype(type("C2",null)).
subtype(type("java.lang.Boolean",null),type("java.lang.Object",null)):-subtype(type("java.lang.Boolean",null)).subtype(type("java.lang.String",null),type("java.lang.Object",null)):-subtype(type("java.lang.String",null)).subtype(type("java.lang.Integer",null),type("java.lang.Object",null)):-subtype(type("java.lang.Integer",null)).subtype(type("OrConsTest",null),type("java.lang.Object",null)):-subtype(type("OrConsTest",null)).subtype(type("MyPair",params(XX,XY)),type("Pair",params(XX,XX))):-subtype(type("MyPair",params(XX,XY))).subtype(type("Pair",params(XX,XY)),type("java.lang.Object",null)):-subtype(type("Pair",params(XX,XY))).subtype(type("List",params(XX)),type("java.lang.Object",null)):-subtype(type("List",params(XX))).subtype(type("Integer",null),type("java.lang.Object",null)):-subtype(type("Integer",null)).subtype(type("String",null),type("java.lang.Object",null)):-subtype(type("String",null)).
#show sigma/2.
-10
View File
@@ -1,10 +0,0 @@
subcons(tph("A"), type("C", "none")).
subcons(tph("A"), type("C2", "none")).
equalcons(tph("A"), type("C2", "none2")).
:- equalcons(A, B), equalcons(A, C), C != B.
subcons(tph(A), type(C, CP)) :- equalcons(tph(A), type(C, CP)).
equalcons(tph(A), type(C, CP)) ; nothingFor(tph(A), type(C, CP)) :- subcons(tph(A), type(C, CP)).
:- nothingFor(tph(A), _), not equalcons(tph(A), _).
-127
View File
@@ -1,127 +0,0 @@
% TEST INPUT
orCons(undCons(lessdot(tph("_BG"),type("java.lang.Number",null)),undCons(equalsdot(tph("_BE"),type("java.lang.Boolean",null)),undCons(equalsdot(type("java.lang.Boolean",null),tph("_AH")),undCons(lessdot(tph("_BC"),type("java.lang.Number",null)),undCons(lessdot(tph("_G"),type("java.lang.Integer",null)),undCons(lessdot(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_AS")),undCons(equalsdot(type("java.lang.Boolean",null),tph("_H")),undCons(lessdot(tph("_AP"),tph("_AM")),undCons(lessdot(tph("_AV"),tph("_AU")),undCons(equalsdot(tph("_AI"),type("Matrix",null)),undCons(lessdot(tph("_AD"),tph("_AB")),undCons(lessdot(type("Matrix",null),tph("_AD")),undCons(lessdot(tph("_AF"),type("java.lang.Number",null)),undCons(equalsdot(tph("_AU"),tph("_CD")),undCons(equalsdot(tph("_H"),type("java.lang.Boolean",null)),undCons(lessdot(tph("_BV"),tph("_BA")),undCons(lessdot(tph("_V"),type("java.lang.Integer",null)),undCons(lessdot(tph("_J"),type("java.lang.Number",null)),undCons(lessdot(tph("_AY"),type("java.lang.Number",null)),undCons(equalsdot(tph("_AH"),type("java.lang.Boolean",null)),undCons(equalsdot(type("java.lang.Boolean",null),tph("_BE")),undCons(equalsdot(tph("_AF"),tph("_CK")),undCons(equalsdot(type("java.lang.Boolean",null),tph("_AW")),undCons(lessdot(tph("_AU"),type("java.lang.Number",null)),undCons(lessdot(tph("_BD"),tph("_BC")),undCons(equalsdot(tph("_AW"),type("java.lang.Boolean",null)),undCons(lessdot(tph("_BB"),tph("_BA")),undCons(lessdot(tph("_AG"),tph("_AF")),undCons(equalsdot(tph("_S"),type("Matrix",null)),undCons(equalsdot(type("java.util.Vector",params(type("java.util.Vector",params(type("java.lang.Integer",null))))),type("java.util.Vector",params(tph("_ANQ")))),undCons(lessdot(type("java.lang.Integer",null),type("java.lang.Number",null)),undCons(equalsdot(type("java.util.Vector",params(type("java.util.Vector",params(type("java.lang.Integer",null))))),type("java.util.Vector",params(tph("_ANR")))),undCons(equalsdot(tph("_BC"),tph("_BW")),undCons(equalsdot(tph("_AQ"),type("Matrix",null)),undCons(lessdot(tph("_AK"),type("java.lang.Number",null)), null))))))))))))))))))))))))))))))))))), null).
orCons(undCons(equalsdot(tph("_AE"),type("Matrix",null)),undCons(lessdot(type("Matrix",null),type("Matrix",null)), null)), null).
orCons(undCons(equalsdot(tph("_AG"),type("java.lang.Integer",null)), null), null).
orCons(undCons(equalsdot(tph("_AI"),type("java.util.AbstractList",params(tph("_AMV")))),undCons(lessdot(type("java.lang.Integer",null),tph("_AK")), null)),orCons(undCons(equalsdot(tph("_AI"),type("Matrix",null)),undCons(lessdot(type("java.lang.Integer",null),tph("_AK")), null)),orCons(undCons(lessdot(type("java.lang.Integer",null),tph("_AK")),undCons(equalsdot(tph("_AI"),type("java.util.List",params(tph("_AMU")))), null)),orCons(undCons(equalsdot(tph("_AI"),type("java.util.AbstractList",params(tph("_AMV")))),undCons(lessdot(type("java.lang.Integer",null),tph("_AK")), null)),orCons(undCons(lessdot(type("java.lang.Integer",null),tph("_AK")),undCons(equalsdot(tph("_AI"),type("java.util.Vector",params(tph("_AMW")))), null)),orCons(undCons(equalsdot(tph("_AI"),type("java.util.List",params(tph("_AMU")))),undCons(lessdot(type("java.lang.Integer",null),tph("_AK")), null)),orCons(undCons(lessdot(type("java.lang.Integer",null),tph("_AK")),undCons(equalsdot(tph("_AI"),type("java.util.Vector",params(tph("_AMW")))), null)),orCons(undCons(equalsdot(tph("_AI"),type("Matrix",null)),undCons(lessdot(type("java.lang.Integer",null),tph("_AK")), null)), null)))))))).
orCons(undCons(lessdot(tph("_AF"),type("java.lang.Integer",null)),undCons(equalsdot(tph("_AQ"),type("java.util.Vector",params(tph("_AMX")))),undCons(lessdot(tph("_AMX"),tph("_AP")), null))),orCons(undCons(lessdot(tph("_AF"),type("java.lang.Integer",null)),undCons(equalsdot(tph("_AQ"),type("Matrix",null)),undCons(lessdot(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_AP")), null))),orCons(undCons(lessdot(tph("_AF"),type("java.lang.Integer",null)),undCons(equalsdot(tph("_AQ"),type("java.util.Vector",params(tph("_AMX")))),undCons(lessdot(tph("_AMX"),tph("_AP")), null))),orCons(undCons(lessdot(tph("_AF"),type("java.lang.Integer",null)),undCons(equalsdot(tph("_AQ"),type("Matrix",null)),undCons(lessdot(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_AP")), null))), null)))).
orCons(undCons(lessdot(type("java.util.Vector",params(tph("_AMY"))),type("java.util.Vector",params(type("java.lang.Integer",null)))),undCons(equalsdot(tph("_AT"),type("java.util.Vector",params(type("GE",null)))), null)), null).
orCons(undCons(equalsdot(tph("_AV"),type("java.lang.Integer",null)), null), null).
orCons(undCons(lessdot(type("java.lang.Integer",null),tph("_AY")),undCons(equalsdot(tph("_AM"),type("Matrix",null)), null)),orCons(undCons(lessdot(type("java.lang.Integer",null),tph("_AY")),undCons(equalsdot(tph("_AM"),type("java.util.List",params(tph("_AMZ")))), null)),orCons(undCons(lessdot(type("java.lang.Integer",null),tph("_AY")),undCons(equalsdot(tph("_AM"),type("java.util.Vector",params(tph("_ANB")))), null)),orCons(undCons(lessdot(type("java.lang.Integer",null),tph("_AY")),undCons(equalsdot(tph("_AM"),type("java.util.List",params(tph("_AMZ")))), null)),orCons(undCons(lessdot(type("java.lang.Integer",null),tph("_AY")),undCons(equalsdot(tph("_AM"),type("java.util.AbstractList",params(tph("_ANA")))), null)),orCons(undCons(lessdot(type("java.lang.Integer",null),tph("_AY")),undCons(equalsdot(tph("_AM"),type("java.util.AbstractList",params(tph("_ANA")))), null)),orCons(undCons(lessdot(type("java.lang.Integer",null),tph("_AY")),undCons(equalsdot(tph("_AM"),type("Matrix",null)), null)),orCons(undCons(lessdot(type("java.lang.Integer",null),tph("_AY")),undCons(equalsdot(tph("_AM"),type("java.util.Vector",params(tph("_ANB")))), null)), null)))))))).
orCons(undCons(equalsdot(tph("_BB"),type("java.lang.Integer",null)), null), null).
orCons(undCons(equalsdot(tph("_BD"),type("java.lang.Integer",null)), null), null).
orCons(undCons(equalsdot(tph("_AM"),type("java.util.Vector",params(tph("_ANE")))),undCons(lessdot(type("java.lang.Integer",null),tph("_BG")), null)),orCons(undCons(lessdot(type("java.lang.Integer",null),tph("_BG")),undCons(equalsdot(tph("_AM"),type("Matrix",null)), null)),orCons(undCons(equalsdot(tph("_AM"),type("java.util.Vector",params(tph("_ANE")))),undCons(lessdot(type("java.lang.Integer",null),tph("_BG")), null)),orCons(undCons(lessdot(type("java.lang.Integer",null),tph("_BG")),undCons(equalsdot(tph("_AM"),type("java.util.AbstractList",params(tph("_AND")))), null)),orCons(undCons(lessdot(type("java.lang.Integer",null),tph("_BG")),undCons(equalsdot(tph("_AM"),type("Matrix",null)), null)),orCons(undCons(equalsdot(tph("_AM"),type("java.util.List",params(tph("_ANC")))),undCons(lessdot(type("java.lang.Integer",null),tph("_BG")), null)),orCons(undCons(equalsdot(tph("_AM"),type("java.util.List",params(tph("_ANC")))),undCons(lessdot(type("java.lang.Integer",null),tph("_BG")), null)),orCons(undCons(lessdot(type("java.lang.Integer",null),tph("_BG")),undCons(equalsdot(tph("_AM"),type("java.util.AbstractList",params(tph("_AND")))), null)), null)))))))).
orCons(undCons(lessdot(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_BK")),undCons(lessdot(tph("_BC"),type("java.lang.Integer",null)),undCons(equalsdot(tph("_AM"),type("Matrix",null)), null))),orCons(undCons(lessdot(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_BK")),undCons(lessdot(tph("_BC"),type("java.lang.Integer",null)),undCons(equalsdot(tph("_AM"),type("Matrix",null)), null))),orCons(undCons(lessdot(tph("_BC"),type("java.lang.Integer",null)),undCons(lessdot(tph("_ANG"),tph("_BK")),undCons(equalsdot(tph("_AM"),type("java.util.AbstractList",params(tph("_ANG")))), null))),orCons(undCons(lessdot(tph("_BC"),type("java.lang.Integer",null)),undCons(equalsdot(tph("_AM"),type("java.util.Vector",params(tph("_ANH")))),undCons(lessdot(tph("_ANH"),tph("_BK")), null))),orCons(undCons(lessdot(tph("_BC"),type("java.lang.Integer",null)),undCons(lessdot(tph("_ANG"),tph("_BK")),undCons(equalsdot(tph("_AM"),type("java.util.AbstractList",params(tph("_ANG")))), null))),orCons(undCons(lessdot(tph("_ANF"),tph("_BK")),undCons(lessdot(tph("_BC"),type("java.lang.Integer",null)),undCons(equalsdot(tph("_AM"),type("java.util.List",params(tph("_ANF")))), null))),orCons(undCons(lessdot(tph("_ANF"),tph("_BK")),undCons(lessdot(tph("_BC"),type("java.lang.Integer",null)),undCons(equalsdot(tph("_AM"),type("java.util.List",params(tph("_ANF")))), null))),orCons(undCons(lessdot(tph("_BC"),type("java.lang.Integer",null)),undCons(lessdot(tph("_ANH"),tph("_BK")),undCons(equalsdot(tph("_AM"),type("java.util.Vector",params(tph("_ANH")))), null))), null)))))))).
orCons(undCons(lessdot(tph("_BC"),type("java.lang.Integer",null)),undCons(lessdot(tph("_ANI"),tph("_BR")),undCons(equalsdot(tph("_AC"),type("java.util.List",params(tph("_ANI")))), null))),orCons(undCons(lessdot(tph("_BC"),type("java.lang.Integer",null)),undCons(equalsdot(tph("_AC"),type("Matrix",null)),undCons(lessdot(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_BR")), null))),orCons(undCons(lessdot(tph("_BC"),type("java.lang.Integer",null)),undCons(equalsdot(tph("_AC"),type("Matrix",null)),undCons(lessdot(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_BR")), null))),orCons(undCons(lessdot(tph("_BC"),type("java.lang.Integer",null)),undCons(lessdot(tph("_ANJ"),tph("_BR")),undCons(equalsdot(tph("_AC"),type("java.util.AbstractList",params(tph("_ANJ")))), null))),orCons(undCons(equalsdot(tph("_AC"),type("java.util.Vector",params(tph("_ANK")))),undCons(lessdot(tph("_BC"),type("java.lang.Integer",null)),undCons(lessdot(tph("_ANK"),tph("_BR")), null))),orCons(undCons(equalsdot(tph("_AC"),type("java.util.Vector",params(tph("_ANK")))),undCons(lessdot(tph("_BC"),type("java.lang.Integer",null)),undCons(lessdot(tph("_ANK"),tph("_BR")), null))),orCons(undCons(lessdot(tph("_BC"),type("java.lang.Integer",null)),undCons(lessdot(tph("_ANI"),tph("_BR")),undCons(equalsdot(tph("_AC"),type("java.util.List",params(tph("_ANI")))), null))),orCons(undCons(lessdot(tph("_BC"),type("java.lang.Integer",null)),undCons(lessdot(tph("_ANJ"),tph("_BR")),undCons(equalsdot(tph("_AC"),type("java.util.AbstractList",params(tph("_ANJ")))), null))), null)))))))).
orCons(undCons(lessdot(tph("_ANM"),tph("_BO")),undCons(equalsdot(tph("_BR"),type("java.util.AbstractList",params(tph("_ANM")))),undCons(lessdot(tph("_AU"),type("java.lang.Integer",null)), null))),orCons(undCons(lessdot(tph("_AU"),type("java.lang.Integer",null)),undCons(equalsdot(tph("_BR"),type("Matrix",null)),undCons(lessdot(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_BO")), null))),orCons(undCons(equalsdot(tph("_BR"),type("java.util.List",params(tph("_ANL")))),undCons(lessdot(tph("_ANL"),tph("_BO")),undCons(lessdot(tph("_AU"),type("java.lang.Integer",null)), null))),orCons(undCons(equalsdot(tph("_BR"),type("java.util.List",params(tph("_ANL")))),undCons(lessdot(tph("_ANL"),tph("_BO")),undCons(lessdot(tph("_AU"),type("java.lang.Integer",null)), null))),orCons(undCons(lessdot(tph("_ANN"),tph("_BO")),undCons(equalsdot(tph("_BR"),type("java.util.Vector",params(tph("_ANN")))),undCons(lessdot(tph("_AU"),type("java.lang.Integer",null)), null))),orCons(undCons(lessdot(tph("_ANM"),tph("_BO")),undCons(equalsdot(tph("_BR"),type("java.util.AbstractList",params(tph("_ANM")))),undCons(lessdot(tph("_AU"),type("java.lang.Integer",null)), null))),orCons(undCons(lessdot(tph("_ANN"),tph("_BO")),undCons(equalsdot(tph("_BR"),type("java.util.Vector",params(tph("_ANN")))),undCons(lessdot(tph("_AU"),type("java.lang.Integer",null)), null))),orCons(undCons(lessdot(tph("_AU"),type("java.lang.Integer",null)),undCons(equalsdot(tph("_BR"),type("Matrix",null)),undCons(lessdot(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_BO")), null))), null)))))))).
orCons(undCons(lessdot(tph("_BO"),type("java.lang.Integer",null)),undCons(equalsdot(type("java.lang.Integer",null),tph("_BU")),undCons(lessdot(tph("_BK"),type("java.lang.Integer",null)), null))), null).
orCons(undCons(lessdot(tph("_BU"),type("java.lang.Integer",null)),undCons(lessdot(tph("_BA"),type("java.lang.Integer",null)),undCons(equalsdot(type("java.lang.Integer",null),tph("_BV")), null))), null).
orCons(undCons(lessdot(tph("_BA"),type("java.util.Vector",params(type("java.lang.Integer",null)))),undCons(equalsdot(tph("_AS"),type("Matrix",null)), null)),orCons(undCons(lessdot(tph("_BA"),type("java.util.Vector",params(type("java.lang.Integer",null)))),undCons(equalsdot(tph("_AS"),type("Matrix",null)), null)),orCons(undCons(equalsdot(tph("_AS"),type("java.util.Vector",params(tph("_ANO")))),undCons(lessdot(tph("_BA"),tph("_ANO")), null)),orCons(undCons(equalsdot(tph("_AS"),type("java.util.Vector",params(tph("_ANO")))),undCons(lessdot(tph("_BA"),tph("_ANO")), null)), null)))).
orCons(undCons(lessdot(tph("_AS"),type("java.util.Vector",params(type("java.lang.Integer",null)))),undCons(equalsdot(tph("_AD"),type("Matrix",null)), null)),orCons(undCons(equalsdot(tph("_AD"),type("java.util.Vector",params(tph("_ANP")))),undCons(lessdot(tph("_AS"),tph("_ANP")), null)),orCons(undCons(lessdot(tph("_AS"),type("java.util.Vector",params(type("java.lang.Integer",null)))),undCons(equalsdot(tph("_AD"),type("Matrix",null)), null)),orCons(undCons(equalsdot(tph("_AD"),type("java.util.Vector",params(tph("_ANP")))),undCons(lessdot(tph("_AS"),tph("_ANP")), null)), null)))).
orCons(undCons(equalsdot(tph("_G"),type("java.lang.Integer",null)), null), null).
orCons(undCons(lessdot(type("java.lang.Integer",null),tph("_J")),undCons(equalsdot(tph("_F"),type("java.util.List",params(tph("_ANS")))), null)),orCons(undCons(equalsdot(tph("_F"),type("java.util.AbstractList",params(tph("_ANT")))),undCons(lessdot(type("java.lang.Integer",null),tph("_J")), null)),orCons(undCons(lessdot(type("java.lang.Integer",null),tph("_J")),undCons(equalsdot(tph("_F"),type("java.util.Vector",params(tph("_ANU")))), null)),orCons(undCons(equalsdot(tph("_F"),type("Matrix",null)),undCons(lessdot(type("java.lang.Integer",null),tph("_J")), null)),orCons(undCons(equalsdot(tph("_F"),type("Matrix",null)),undCons(lessdot(type("java.lang.Integer",null),tph("_J")), null)),orCons(undCons(lessdot(type("java.lang.Integer",null),tph("_J")),undCons(equalsdot(tph("_F"),type("java.util.List",params(tph("_ANS")))), null)),orCons(undCons(lessdot(type("java.lang.Integer",null),tph("_J")),undCons(equalsdot(tph("_F"),type("java.util.Vector",params(tph("_ANU")))), null)),orCons(undCons(equalsdot(tph("_F"),type("java.util.AbstractList",params(tph("_ANT")))),undCons(lessdot(type("java.lang.Integer",null),tph("_J")), null)), null)))))))).
orCons(undCons(lessdot(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(lessdot(tph("_ANV"),tph("_N")),undCons(equalsdot(tph("_F"),type("java.util.Vector",params(tph("_ANV")))), null))),orCons(undCons(equalsdot(tph("_F"),type("Matrix",null)),undCons(lessdot(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(lessdot(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_N")), null))),orCons(undCons(lessdot(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(lessdot(tph("_ANV"),tph("_N")),undCons(equalsdot(tph("_F"),type("java.util.Vector",params(tph("_ANV")))), null))),orCons(undCons(equalsdot(tph("_F"),type("Matrix",null)),undCons(lessdot(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(lessdot(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_N")), null))), null)))).
orCons(undCons(equalsdot(tph("_F"),type("Matrix",null)),undCons(lessdot(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(lessdot(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_N")), null))),orCons(undCons(equalsdot(tph("_F"),type("java.util.Vector",params(tph("_ANX")))),undCons(lessdot(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(lessdot(tph("_ANX"),tph("_N")), null))),orCons(undCons(equalsdot(tph("_F"),type("java.util.Vector",params(tph("_ANX")))),undCons(lessdot(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(lessdot(tph("_ANX"),tph("_N")), null))),orCons(undCons(equalsdot(tph("_F"),type("Matrix",null)),undCons(lessdot(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(lessdot(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_N")), null))), null)))).
orCons(undCons(equalsdot(tph("_F"),type("Matrix",null)),undCons(lessdot(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(lessdot(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_N")), null))),orCons(undCons(lessdot(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(equalsdot(tph("_F"),type("Matrix",null)),undCons(lessdot(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_N")), null))),orCons(undCons(equalsdot(tph("_F"),type("java.util.Vector",params(tph("_ANZ")))),undCons(lessdot(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(lessdot(tph("_ANZ"),tph("_N")), null))),orCons(undCons(equalsdot(tph("_F"),type("java.util.Vector",params(tph("_ANZ")))),undCons(lessdot(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(lessdot(tph("_ANZ"),tph("_N")), null))), null)))).
orCons(undCons(equalsdot(tph("_F"),type("Matrix",null)),undCons(lessdot(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(lessdot(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_N")), null))),orCons(undCons(lessdot(tph("_AOB"),tph("_N")),undCons(lessdot(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(equalsdot(tph("_F"),type("java.util.Vector",params(tph("_AOB")))), null))),orCons(undCons(lessdot(tph("_AOB"),tph("_N")),undCons(lessdot(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(equalsdot(tph("_F"),type("java.util.Vector",params(tph("_AOB")))), null))),orCons(undCons(lessdot(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(equalsdot(tph("_F"),type("Matrix",null)),undCons(lessdot(type("java.util.Vector",params(type("java.lang.Integer",null))),tph("_N")), null))), null)))).
orCons(undCons(lessdot(type("java.lang.Boolean",null),tph("_R")),undCons(lessdot(tph("_N"),tph("_AOA")),undCons(equalsdot(tph("_S"),type("java.util.Vector",params(tph("_AOA")))), null))),orCons(undCons(lessdot(type("java.lang.Boolean",null),tph("_R")),undCons(lessdot(tph("_N"),tph("_ANW")),undCons(equalsdot(tph("_S"),type("java.util.List",params(tph("_ANW")))), null))),orCons(undCons(lessdot(type("java.lang.Boolean",null),tph("_R")),undCons(lessdot(tph("_N"),tph("_ANW")),undCons(equalsdot(tph("_S"),type("java.util.List",params(tph("_ANW")))), null))),orCons(undCons(lessdot(type("java.lang.Boolean",null),tph("_R")),undCons(lessdot(tph("_N"),tph("_AOA")),undCons(equalsdot(tph("_S"),type("java.util.Vector",params(tph("_AOA")))), null))),orCons(undCons(lessdot(type("java.lang.Boolean",null),tph("_R")),undCons(equalsdot(tph("_S"),type("Matrix",null)),undCons(lessdot(tph("_N"),type("java.util.Vector",params(type("java.lang.Integer",null)))), null))),orCons(undCons(lessdot(type("java.lang.Boolean",null),tph("_R")),undCons(equalsdot(tph("_S"),type("Matrix",null)),undCons(lessdot(tph("_N"),type("java.util.Vector",params(type("java.lang.Integer",null)))), null))),orCons(undCons(lessdot(type("java.lang.Boolean",null),tph("_R")),undCons(equalsdot(tph("_S"),type("java.util.AbstractList",params(tph("_ANY")))),undCons(lessdot(tph("_N"),tph("_ANY")), null))),orCons(undCons(lessdot(type("java.lang.Boolean",null),tph("_R")),undCons(equalsdot(tph("_S"),type("java.util.AbstractList",params(tph("_ANY")))),undCons(lessdot(tph("_N"),tph("_ANY")), null))), null)))))))).
orCons(undCons(equalsdot(tph("_U"),type("java.lang.Integer",null)), null), null).
orCons(undCons(lessdot(type("java.lang.Integer",null),type("java.lang.Integer",null)),undCons(lessdot(tph("_U"),type("java.lang.Integer",null)),undCons(equalsdot(type("java.lang.Integer",null),tph("_V")), null))), null).
super(type("java.lang.Boolean",null),type("Object",null)):-super(type("java.lang.Boolean",null)).super(type("java.lang.Integer",null),type("java.lang.Number",null)):-super(type("java.lang.Integer",null)).super(type("java.lang.Number",null),type("Object",null)):-super(type("java.lang.Number",null)).super(type("java.util.Vector",params(XX)),type("Object",null)):-super(type("java.util.Vector",params(XX))).super(type("Matrix",null),type("java.util.Vector",params(type("java.util.Vector",params(type("java.lang.Integer",null)))))):-super(type("Matrix",null)).
%%%%%
super(type("MyPair", params(X, Y)), type("Pair", params(Y, X))) :- super(type("MyPair", params(X, Y))).
super(type("ArrayList", params(X)), type("List", params(X))) :- super(type("ArrayList", params(X))).
super(type("List", params(X)), type("Object", null)) :- super(type("List", params(X))).
super(type("Integer", null), type("Object", null)) :- super(type("Integer", null)).
super(type("Matrix", null), type("Vector", params(type("Vector", params(type("Integer", null)))))) :- super(type("Matrix", null)).
super(type("Vector", params(X)), type("Object", null)) :- super(type("Vector", params(X))).
% Subtyping
super(A, A) :- super(A, B). % reflexive
super(B) :- super(A, B). % transitive
super(A, C) :- super(A, B), super(B, C). % transitive
less(A,B) :- super(type(A, AP), type(B, BP)).
% Or-Constraints
undCons(A,B) :- orCons(undCons(A,B), null).
undCons(A,B); orCons(C,D) :- orCons(undCons(A,B), orCons(C,D)).
lessdot(A,B) :- undCons(lessdot(A,B), _).
undCons(B,C) :- undCons(A, undCons(B, C)).
% undCons
lessdot(A,B) :- undCons(lessdot(A,B), _).
undCons(C,D) :- undCons(_, undCons(C,D)).
% substitution
subst(tph(A), type(C,P)) :- equalsdot(tph(A), type(C,P)).
subst(A) :- equalsdot(A, B).
subst(B) :- equalsdot(A, B).
equalsdot(B, C) :- subst(A,B), equalsdot(A, C).
equalsdot(C, B) :- subst(A,B), equalsdot(C, A).
subst(A) :- lessdot(A, B).
subst(B) :- lessdot(A, B).
lessdot(B, C) :- subst(A,B), lessdot(A, C).
lessdot(C, B) :- subst(A,B), lessdot(C, A).
subst(type(N, params(P)), type(N, params(S))) :- subst(type(N, params(P))), subst(P, S).
% match
super(C) :- lessdot(TPH, C).
lessdot(C, D) :- lessdot(TPH, C), lessdot(TPH, D), super(C, D).
% reduce
equalsdot(AP, BP) :- equalsdot(type(A, params(AP)), type(A, params(BP))).
equalsdot(AP, BP) :- equalsdot(type(A, params(AP, AP2)), type(A, params(BP, BP2))).
equalsdot(AP2, BP2) :- equalsdot(type(A, params(AP, AP2)), type(A, params(BP, BP2))).
equalsdot(AP, BP) :- equalsdot(type(A, params(AP, AP2, AP3)), type(A, params(BP, BP2, BP3))).
equalsdot(AP2, BP2) :- equalsdot(type(A, params(AP, AP2, AP3)), type(A, params(BP, BP2, BP3))).
equalsdot(AP3, BP3) :- equalsdot(type(A, params(AP, AP2, AP3)), type(A, params(BP, BP2, BP3))).
% Swap
equalsdot(tph(B),type(A, AP)) :- equalsdot(type(A, AP), tph(B)).
% adapt
super(type(C,CP)) :- lessdot(type(C,CP),type(D, DP)). % generate
equalsdot(type(D, N), type(D, DP)) :- lessdot(type(C,CP),type(D, DP)), super(type(C, CP), type(D, N)).
% adopt
lessdot(tph(B), type(C, CP)) :- lessdot(tph(A), type(C, CP)), lessdot(tph(B), tph(A)).
% step 2
super(type(C, CP)) :- lessdot(type(C, CP), tph(A)).
equalsdot(tph(A), type(C, CP)); lessdot(type(D, DP), tph(A)) :- lessdot(type(C, CP), tph(A)), super(type(C, CP), type(D, DP)).
equalsdot(tph(A), type(C, CP)) :- lessdot(type(C, CP), tph(A)), not super(type(C, CP),_).
% a <. C , a <. b constraints:
lessdot(tph(B), type(C, CP)); lessdot(type(C, CP), tph(B)) :- lessdot(tph(A), type(C, CP)), lessdot(tph(A), tph(B)).
% errors
tphs( P ) :- equalsdot(tph(A), type(C, P)).
tphs(tph(P), params(tph(P))) :- tphs( params(tph(P))).
tphs(P) :- tphs( params(type(C, P))).
tphs(tph(A), params(type(C, P))) :- tphs( params(type(C, P))), tphs(tph(A), P).
tphs(tph(P), params(X, tph(P))) :- tphs( params(X, tph(P))).
tphs(tph(P), params(tph(P), X)) :- tphs( params(tph(P), X)).
tphs(P) :- tphs( params(X, type(C, P))).
tphs(P) :- tphs( params(type(C, P), X)).
tphs(tph(A), params(X, type(C, P))) :- tphs( params(X, type(C, P))), tphs(tph(A), P).
tphs(tph(A), params(type(C, P), X)) :- tphs( params(type(C, P), X)), tphs(tph(A), P).
:- equalsdot(tph(A), type(C, P)), tphs(tph(A), P). % fail for subst
:- equalsdot(type(C, CP), type(D, DP)), C != D. % fail for reduce
:- lessdot(type(C, CP), type(D, DP)), not less(C, D). % fail for adapt
:- lessdot(tph(A), type(D, DP)), lessdot(tph(A), type(C, CP)), not less(C, D), not less(D, C). %Fail for match
% solve
sigma(tph(A), type(C,P)) :- equalsdot(tph(A), type(C,P)).
sigma2(tph(A), type(C,P)) :- lessdot(tph(A), type(C,P)), not sigma(tph(A), _).
#show sigma2/2.
#show sigma/2.
%#show subst/2.
-166
View File
@@ -1,166 +0,0 @@
% Or-Constraints
undCons(A,B) :- orCons(undCons(A,B), null).
undCons(A,B); orCons(C,D) :- orCons(undCons(A,B), orCons(C,D)).
% undCons
subcons(A,B) :- undCons(subcons(A,B), _).
undCons(C,D) :- undCons(_, undCons(C,D)).
equalcons(A,B) :- undCons(equalcons(A,B), _).
undCons(B,C) :- undCons(A, undCons(B, C)).
% Subtyping
subtype(B, B) :- subtype(A, B). % reflexive
subtype(A, A) :- subtype(A, B). % reflexive
subtype(A, C) :- subtype(A, B), subtype(B, C). % transitive
% we use subst to only replace tph's with real types:
subst(tph(A), type(C, CP)):- equalcons(tph(A), type(C,CP)).
% subst-L:
subcons(B,C) :- subst(A, B), subcons(A, C).
%subst-R:
subcons(C,B) :- subst(A, B), subcons(C, A).
%subst-Equal:
equalcons(B,C) :- subst(A, B), equalcons(A, C).
%swap:
equalcons(A,B) :- equalcons(B,A).
%unfold:
equalcons(T, T) :- equalcons(_, type(_, params(T))).
equalcons(T, T) :- equalcons(_, type(_, params(T, _))).
equalcons(T, T) :- equalcons(_, type(_, params(_, T))).
equalcons(T, T) :- equalcons(_, type(_, params(T, _, _))).
equalcons(T, T) :- equalcons(_, type(_, params(_, T, _))).
equalcons(T, T) :- equalcons(_, type(_, params(_, _, T))).
%unfold-Right:
equalcons(T, T) :- subcons(_, type(_, params(T))).
equalcons(T, T) :- subcons(_, type(_, params(T, _))).
equalcons(T, T) :- subcons(_, type(_, params(_, T))).
equalcons(T, T) :- subcons(_, type(_, params(T, _, _))).
equalcons(T, T) :- subcons(_, type(_, params(_, T, _))).
equalcons(T, T) :- subcons(_, type(_, params(_, _, T))).
%unfold-Left:
equalcons(T, T) :- subcons(type(_, params(T)), _).
equalcons(T, T) :- subcons(type(_, params(T, _)), _).
equalcons(T, T) :- subcons(type(_, params(_, T)), _).
equalcons(T, T) :- subcons(type(_, params(T, _, _)), _).
equalcons(T, T) :- subcons(type(_, params(_, T, _)), _).
equalcons(T, T) :- subcons(type(_, params(_, _, T)), _).
% Subst-Param:
subcons(A, type(C, params(T2))) :- subcons(A, type(C, params(T))), subst(T, T2).
subcons(A, type(C, params(T2, P2))) :- subcons(A, type(C, params(T, P2))), subst(T, T2).
subcons(A, type(C, params(P1, T2))) :- subcons(A, type(C, params(P1, T))), subst(T, T2).
subcons(A, type(C, params(T2, P2, P3))) :- subcons(A, type(C, params(T, P2, P3))), subst(T, T2).
subcons(A, type(C, params(P1, T2, P3))) :- subcons(A, type(C, params(P1, T, P3))), subst(T, T2).
subcons(A, type(C, params( P1, P2, T2))) :- subcons(A, type(C, params(P1, P2, T))), subst(T, T2).
% Subst-Param':
subcons(A, type(C, params(T2))) :- equalcons(A, type(C, params(T))), subst(T, T2).
subcons(A, type(C, params(T2, P2))) :- equalcons(A, type(C, params(T, P2))), subst(T, T2).
subcons(A, type(C, params(P1, T2))) :- equalcons(A, type(C, params(P1, T))), subst(T, T2).
subcons(A, type(C, params(T2, P2, P3))) :- equalcons(A, type(C, params(T, P2, P3))), subst(T, T2).
subcons(A, type(C, params(P1, T2, P3))) :- equalcons(A, type(C, params(P1, T, P3))), subst(T, T2).
subcons(A, type(C, params( P1, P2, T2))) :- equalcons(A, type(C, params(P1, P2, T))), subst(T, T2).
% adapt
equalcons(type(D,P3), type(D,P2)) :- subcons(type(C,P), type(D, P2)), subtype(type(C, P), type(D, P3)).
%subtype(type(A, P)) :- subcons(type(_, _), type(A, P)).
subtype(type(A, P)) :- subcons(type(A, P), _).
% reduce
equalcons(P1, PP1) :- equalcons(type(C, params(P1)), type(C, params(PP1))).
equalcons(P1, PP1) :- equalcons(type(C, params(P1, P2)), type(C, params(PP1, PP2))).
equalcons(P2, PP2) :- equalcons(type(C, params(P1, P2)), type(C, params(PP1, PP2))).
equalcons(P1, PP1) :- equalcons(type(C, params(P1, P2, P3)), type(C, params(PP1, PP2, PP3))).
equalcons(P2, PP2) :- equalcons(type(C, params(P1, P2, P3)), type(C, params(PP1, PP2, PP3))).
equalcons(P3, PP3) :- equalcons(type(C, params(P1, P2, P3)), type(C, params(PP1, PP2, PP3))).
% super
{ equalcons(tph(A), type(D, DP)): subtype(type(C, CP), type(D, DP)) } == 1 :- subcons(type(C, CP), tph(A)).
% equalcons(tph(A), type(D, DP)) ; notequals(tph(A), type(D, DP)) :- subcons(type(C, CP), tph(A)), subtype(type(C, CP), type(D, DP)).
% equalcons(tph(A), type(D, CP)) :- subcons(type(C, CP), tph(A)), subtype(type(C, CP), type(D, DP)).
%Solution:
tphs( P ) :- equalcons(tph(A), type(C, P)).
sigma(tph(A), type(C,P)) :- equalcons(tph(A), type(C, P)), not tphs(_, P).
%Solution-Gen:
equalcons(tph(A), type(C, CP)) ; nothingFor(tph(A), type(C, CP)) :- subcons(tph(A), type(C, CP)).
%Solution-Requirement:
:- nothingFor(tph(A), _), not equalcons(tph(A), _).
% Fail-Subtype:
% G1 <. G2, G1 </: G2 ==> fail (G1, G2 ground, i.e. free of type placeholders)
% Once Solution-Gen has assigned a type to a placeholder, subst-L/subst-R rewrite every
% constraint mentioning it into one over the substituted types, so a wrong assignment surfaces as
% a subcons/2 between two ground types: solving `_a <. java.lang.Boolean` with java.lang.Object
% derives `subcons(type("java.lang.Object",null), type("java.lang.Boolean",null))`. A ground
% constraint is decidable - it holds iff the class hierarchy says so - and nothing checked it so
% far, which is what let a placeholder be solved with a type violating its own upper bounds.
% The restriction to ground terms is required for soundness, not an optimisation: a constraint
% still containing a placeholder, such as Box<_a> <. Box<_b>, cannot be validated before those
% placeholders are substituted.
:- subcons(S, T), groundType(S), groundType(T), not subtype(S, T).
% groundType(T): type term T occurs in the constraint set and contains no type placeholder.
groundType(T) :- typeTerm(T), not containsTph(T).
containsTph(tph(A)) :- typeTerm(tph(A)).
containsTph(type(C, params(P1))) :- typeTerm(type(C, params(P1))), containsTph(P1).
containsTph(type(C, params(P1, P2))) :- typeTerm(type(C, params(P1, P2))), containsTph(P1).
containsTph(type(C, params(P1, P2))) :- typeTerm(type(C, params(P1, P2))), containsTph(P2).
containsTph(type(C, params(P1, P2, P3))) :- typeTerm(type(C, params(P1, P2, P3))), containsTph(P1).
containsTph(type(C, params(P1, P2, P3))) :- typeTerm(type(C, params(P1, P2, P3))), containsTph(P2).
containsTph(type(C, params(P1, P2, P3))) :- typeTerm(type(C, params(P1, P2, P3))), containsTph(P3).
% Every type term occurring in a constraint, including the ones nested in type parameters.
typeTerm(S) :- subcons(S, _).
typeTerm(T) :- subcons(_, T).
typeTerm(S) :- equalcons(S, _).
typeTerm(T) :- equalcons(_, T).
typeTerm(P1) :- typeTerm(type(_, params(P1))).
typeTerm(P1) :- typeTerm(type(_, params(P1, _))).
typeTerm(P2) :- typeTerm(type(_, params(_, P2))).
typeTerm(P1) :- typeTerm(type(_, params(P1, _, _))).
typeTerm(P2) :- typeTerm(type(_, params(_, P2, _))).
typeTerm(P3) :- typeTerm(type(_, params(_, _, P3))).
% S-Object
subcons(tph(A), type("java.lang.Object", null)) :- subcons(tph(A), _).
subcons(tph(A), type("java.lang.Object", null)) :- subcons(_, tph(A)).
subcons(tph(A), type("java.lang.Object", null)) :- equalcons(tph(A), _).
%% Helpers
%tphs:
tphs(tph(P), params(tph(P))) :- tphs( params(tph(P))).
tphs(P) :- tphs( params(type(C, P))).
tphs(tph(A), params(type(C, P))) :- tphs( params(type(C, P))), tphs(tph(A), P).
tphs(tph(P), params(X, tph(P))) :- tphs( params(X, tph(P))).
tphs(tph(P), params(tph(P), X)) :- tphs( params(tph(P), X)).
tphs(P) :- tphs( params(X, type(C, P))).
tphs(P) :- tphs( params(type(C, P), X)).
tphs(tph(A), params(X, type(C, P))) :- tphs( params(X, type(C, P))), tphs(tph(A), P).
tphs(tph(A), params(type(C, P), X)) :- tphs( params(type(C, P), X)), tphs(tph(A), P).
tphs(tph(P), params(tph(P), X, Y)) :- tphs( params(tph(P), X, Y)).
tphs(tph(P), params(X, tph(P), Y)) :- tphs( params(X, tph(P), Y)).
tphs(tph(P), params(X,Y,tph(P))) :- tphs( params(X, Y, tph(P))).
tphs(P) :- tphs( params(type(C, P), X, Y)).
tphs(P) :- tphs( params(X, type(C, P),Y)).
tphs(P) :- tphs( params(X,Y,type(C, P))).
tphs(tph(A), params(type(C, P), X, Y)) :- tphs( params(type(C, P), X, Y)), tphs(tph(A), P).
tphs(tph(A), params(X, type(C, P), Y)) :- tphs( params(X, type(C, P), Y)), tphs(tph(A), P).
tphs(tph(A), params(X, Y, type(C, P))) :- tphs( params(X, Y, type(C, P))), tphs(tph(A), P).
-426
View File
@@ -1,426 +0,0 @@
%==============================================================================================
% unifyFinal.lp - global type inference for Java by unification, as an Answer Set Program.
%
% Source: the program printed in dissertation/chapters/unifyWithASP.tex, section
% "ASP Program + Example Input" (\label{appendix:program}), transcribed verbatim except that
% its embedded "% TEST INPUT" constraint set and its trailing "#show sigma/2." are left out
% (show.lp provides the latter), and one rule is added - see Fail-Equals in PART 2.
%
% Rule names in CAPITALS refer to the inference rules of
% Figure "Unify Algorithm" (\label{fig:aspUnifyAlgorithm}) and
% Figure "Subtyping" (\label{fig:aspSubtyping}).
%
% Notation used in the paper and mirrored here:
% a, b type placeholders tph("_a")
% G a *ground* type - one containing no placeholder anywhere
% N, C<...> a class type type("java.util.List", params(...))
% T <. T' subtype constraint subcons(T, T')
% T =. T' equality constraint equalcons(T, T')
% T <: T' the Java subtype relation subtype(T, T')
% sigma(a) the computed unifier sigma(tph("_a"), type(...))
%
% File layout:
% PART 1 Input: constraint set, or-constraints, extends relations, subtyping
% PART 2 The algorithm: one section per rule of the paper
% PART 3 Helpers: depth, groundness, placeholder occurrence
%==============================================================================================
%==============================================================================================
% PART 1 - INPUT
%==============================================================================================
%
% Everything in this part turns the facts emitted by JavaTypeUnifyASP's `gen-facts` command into
% the two constraint predicates the algorithm works on (subcons/2, equalcons/2) plus the Java
% subtype relation (subtype/2).
%
% ---------------------------------------------------------------------------------------------
% What the input looks like
% ---------------------------------------------------------------------------------------------
% JavaConstraintGenerator writes a textual .cons file; `gen-facts` parses it (grammar:
% src/main/antlr4/.../ConstraintSet.g4) and emits ASP facts. A .cons file has three kinds of line:
%
% Sub < Super an extends/implements edge, type arguments included
% T <. T' a subtype constraint
% { a, b | c, d } an or-constraint: at least one alternative, all of its parts
%
% Types are written `java.util.List<java.lang.Integer>` and placeholders `_Foo_3`. These become:
%
% type("java.util.List", params(type("java.lang.Integer", null))) a class type
% type("java.lang.Integer", null) no type arguments
% tph("_Foo_3") a type placeholder
%
% A simple constraint `_Foo_3 <. java.lang.Number` is emitted as a one-element or-constraint:
%
% orCons(undCons(subcons(tph("_Foo_3"), type("java.lang.Number",null)), null), null).
%
% so there is exactly one shape to unpack, whether or not the constraint had alternatives.
% An or-constraint nests: orCons(<alternative>, orCons(<alternative>, ... null)), and each
% alternative is a chain undCons(<constraint>, undCons(<constraint>, ... null)).
%
% ---------------------------------------------------------------------------------------------
% Where the extends relations come from
% ---------------------------------------------------------------------------------------------
% They are not facts of this program; they are supplied per run, exactly like the constraint set.
% JavaConstraintGenerator reads them off the analysed Java sources (`class C extends D`,
% `implements E`) and off the JDK/library classes it reflects, walking up until every ancestor is
% covered. Each edge keeps its type arguments, and ASPGenerator emits it as a *guarded rule*, not
% a fact - realizing S-CLASS of Figure "Subtyping":
%
% class C<X> extends D<X>
% ==> subtype(type("C", params(XX)), type("D", params(XX)))
% :- subtype(type("C", params(XX))).
%
% Two things make the guard necessary rather than decorative:
% - it *binds* XX. A bare fact with a free variable is not safe and clingo rejects it.
% - it instantiates the edge lazily, only for the type arguments a given run actually mentions.
% Note the head is subtype/2 and the body subtype/1 - different predicates, so this is not a
% self-referential rule. subtype/1 is derived below from the constraints.
%
% Because the edges arrive as rules, `Matrix < java.util.Vector<java.util.Vector<java.lang.Integer>>`
% is what lets ADAPT resolve `Matrix <. java.util.Vector<X>` to X = Vector<Integer>. An *erased*
% edge would give a subtype/2 fact that no parameterized occurrence can ever match.
%==============================================================================================
% ---------------------------------------------------------------------------------------------
% Or-constraints: choose exactly one alternative, then take all of its conjuncts.
% This is the ASP encoding of the constraint set's disjunctive structure; the paper treats a
% constraint set as already-chosen and does not name a rule for it.
% ---------------------------------------------------------------------------------------------
% One alternative left in the chain: it is forced.
undCons(A,B) :- orCons(undCons(A,B), null).
% More than one: pick this alternative, or move on to the rest. Exactly one is chosen.
{ undCons(A,B); orCons(C,D) } == 1 :- orCons(undCons(A,B), orCons(C,D)).
% Unpack the chosen alternative's conjunct chain into plain constraints.
subcons(A,B) :- undCons(subcons(A,B), _).
equalcons(A,B) :- undCons(equalcons(A,B), _).
undCons(C,D) :- undCons(_, undCons(C,D)).
undCons(B,C) :- undCons(A, undCons(B, C)).
% ---------------------------------------------------------------------------------------------
% Subtyping - Figure "Subtyping" (\label{fig:aspSubtyping}).
% S-CLASS arrives as the generated rules described above; the closure is here.
% ---------------------------------------------------------------------------------------------
% Java: every reference type is a subtype of Object. Stated directly so that the last hop of any
% chain is always one step from a type the constraints actually mention.
subtype(A, type("java.lang.Object", null)):- subtype(A).
% S-REFL: T <: T
subtype(A, A) :- subtype(A).
subtype(A, A) :- subtype(A, B).
% S-TRANS: T1 <: T2, T2 <: T3 ==> T1 <: T3
subtype(B) :- subtype(A, B).
subtype(A, C) :- subtype(A, B), subtype(B, C).
% Erasure-level subtyping: the same relation with type arguments dropped. Used by Fail-Subtype
% below, which is the one place the appendix compares class names only.
namedSubtype(A,B) :- subtype(type(A, AP), type(B, BP)).
% subtype/1 - "this type occurs in the constraint set", the guard that activates the generated
% S-CLASS rules. Seeded from both sides of every subtype constraint.
subtype(type(A, P)) :- subcons(_, type(A, P)).
subtype(type(A, P)) :- subcons(type(A, P), _).
%==============================================================================================
% PART 2 - THE ALGORITHM
% One section per inference rule of Figure "Unify Algorithm" (\label{fig:aspUnifyAlgorithm}).
%==============================================================================================
% ---------------------------------------------------------------------------------------------
% SUBST - the substitution relation the four Subst-* rules below are phrased against.
%
% The paper writes every Subst rule with a *ground* type G on the right: `a =. G`. That
% restriction is what keeps grounding finite - substituting a type that still contains a
% placeholder can feed a placeholder's own solution back into itself and build ever-deeper terms
% (see "Grounding bottleneck" in the chapter). It is enforced here by deriving subst from
% sigma/2 rather than from equalcons/2: SOLUTION below only produces sigma for a type that
% contains no placeholder.
% ---------------------------------------------------------------------------------------------
subst(tph(A), type(N,P)) :- sigma(tph(A), type(N, P)).
% SUBST-L: a =. G, a <. T ==> G <. T
subcons(B,C) :- subst(A, B), subcons(A, C).
% SUBST-R: a =. G, T <. a ==> T <. G
subcons(C,B) :- subst(A, B), subcons(C, A).
% SUBST-EQUAL: a =. G, a =. T ==> T =. G
equalcons(B,C) :- subst(A, B), equalcons(A, C).
% SWAP: T1 =. T2 ==> T2 =. T1
equalcons(A,B) :- equalcons(B,A).
% ---------------------------------------------------------------------------------------------
% S-OBJECT: a <. Object for every placeholder a
%
% One rule per position a placeholder can occupy in a constraint - either side of <. and =., and
% nested inside a type argument at any of the three supported arities. Giving every placeholder
% at least one upper bound is what makes SOLUTION-GEN able to answer for it at all.
% ---------------------------------------------------------------------------------------------
subcons(tph(A), type("java.lang.Object", null)) :- subcons(tph(A), _).
subcons(tph(A), type("java.lang.Object", null)) :- subcons(_, tph(A)).
subcons(tph(A), type("java.lang.Object", null)) :- subcons(_, type(_, params(tph(A)))).
subcons(tph(A), type("java.lang.Object", null)) :- subcons(_, type(_, params(tph(A), _))).
subcons(tph(A), type("java.lang.Object", null)) :- subcons(_, type(_, params(_, tph(A)))).
subcons(tph(A), type("java.lang.Object", null)) :- subcons(_, type(_, params(tph(A), _, _))).
subcons(tph(A), type("java.lang.Object", null)) :- subcons(_, type(_, params(_, tph(A), _))).
subcons(tph(A), type("java.lang.Object", null)) :- subcons(_, type(_, params(_, _, tph(A)))).
subcons(tph(A), type("java.lang.Object", null)) :- subcons(type(_, params(tph(A))), _).
subcons(tph(A), type("java.lang.Object", null)) :- subcons(type(_, params(tph(A), _)), _).
subcons(tph(A), type("java.lang.Object", null)) :- subcons(type(_, params(_, tph(A))), _).
subcons(tph(A), type("java.lang.Object", null)) :- subcons(type(_, params(tph(A), _, _)), _).
subcons(tph(A), type("java.lang.Object", null)) :- subcons(type(_, params(tph(A), _, _)), _).
subcons(tph(A), type("java.lang.Object", null)) :- subcons(type(_, params(_, tph(A), _)), _).
subcons(tph(A), type("java.lang.Object", null)) :- subcons(type(_, params(_, _, tph(A))), _).
subcons(tph(A), type("java.lang.Object", null)) :- equalcons(tph(A), _).
subcons(tph(A), type("java.lang.Object", null)) :- equalcons(_, tph(A)).
subcons(tph(A), type("java.lang.Object", null)) :- equalcons(_, type(_, params(tph(A)))).
subcons(tph(A), type("java.lang.Object", null)) :- equalcons(_, type(_, params(tph(A), _))).
subcons(tph(A), type("java.lang.Object", null)) :- equalcons(_, type(_, params(_, tph(A)))).
subcons(tph(A), type("java.lang.Object", null)) :- equalcons(_, type(_, params(tph(A), _, _))).
subcons(tph(A), type("java.lang.Object", null)) :- equalcons(_, type(_, params(_, tph(A), _))).
subcons(tph(A), type("java.lang.Object", null)) :- equalcons(_, type(_, params(_, _, tph(A)))).
subcons(tph(A), type("java.lang.Object", null)) :- equalcons(type(_, params(tph(A))), _).
subcons(tph(A), type("java.lang.Object", null)) :- equalcons(type(_, params(tph(A), _)), _).
subcons(tph(A), type("java.lang.Object", null)) :- equalcons(type(_, params(_, tph(A))), _).
subcons(tph(A), type("java.lang.Object", null)) :- equalcons(type(_, params(tph(A), _, _)), _).
subcons(tph(A), type("java.lang.Object", null)) :- equalcons(type(_, params(tph(A), _, _)), _).
subcons(tph(A), type("java.lang.Object", null)) :- equalcons(type(_, params(_, tph(A), _)), _).
subcons(tph(A), type("java.lang.Object", null)) :- equalcons(type(_, params(_, _, tph(A))), _).
% ---------------------------------------------------------------------------------------------
% SUBST-PARAM: a =. G, T =. C<P1..a..Pn> ==> T =. C<P1..G..Pn>
% SUBST-PARAM-RIGHT: a =. G, b <. C<T1..a..Tn> ==> b <. C<P1..G..Pn>
%
% Substitution *inside* a type argument, one rule per parameter position (arities one to three -
% see "Fixed Arity for Parameter Lists"). SUBST-PARAM-LEFT of the figure, which rewrites the left
% operand of a <., has no counterpart here.
%
% Each firing makes a type one level deeper, so a cyclic assignment such as a =. List<a> would
% nest without bound. FAIL-CYCLE below rules such cycles out, but clingo grounds before it
% evaluates any integrity constraint, so the grounder would diverge first. The maxdepth guard is
% what keeps grounding finite; depth/2 is defined in PART 3.
% ---------------------------------------------------------------------------------------------
maxdepth(5).
equalcons(A, type(C, params(T2))) :- equalcons(A, type(C, params(T))), subst(T, T2), depth(T2, D), maxdepth(Dmax), D < Dmax.
equalcons(A, type(C, params(T2, P2))) :- equalcons(A, type(C, params(T, P2))), subst(T, T2), depth(T2, D), maxdepth(Dmax), D < Dmax.
equalcons(A, type(C, params(P1, T2))) :- equalcons(A, type(C, params(P1, T))), subst(T, T2), depth(T2, D), maxdepth(Dmax), D < Dmax.
equalcons(A, type(C, params(T2, P2, P3))) :- equalcons(A, type(C, params(T, P2, P3))), subst(T, T2), depth(T2, D), maxdepth(Dmax), D < Dmax.
equalcons(A, type(C, params(P1, T2, P3))) :- equalcons(A, type(C, params(P1, T, P3))), subst(T, T2), depth(T2, D), maxdepth(Dmax), D < Dmax.
equalcons(A, type(C, params( P1, P2, T2))) :- equalcons(A, type(C, params(P1, P2, T))), subst(T, T2), depth(T2, D), maxdepth(Dmax), D < Dmax.
subcons(A, type(C, params(T2))) :- subcons(A, type(C, params(T))), subst(T, T2), depth(T2, D), maxdepth(Dmax), D < Dmax.
subcons(A, type(C, params(T2, P2))) :- subcons(A, type(C, params(T, P2))), subst(T, T2), depth(T2, D), maxdepth(Dmax), D < Dmax.
subcons(A, type(C, params(P1, T2))) :- subcons(A, type(C, params(P1, T))), subst(T, T2), depth(T2, D), maxdepth(Dmax), D < Dmax.
subcons(A, type(C, params(T2, P2, P3))) :- subcons(A, type(C, params(T, P2, P3))), subst(T, T2), depth(T2, D), maxdepth(Dmax), D < Dmax.
subcons(A, type(C, params(P1, T2, P3))) :- subcons(A, type(C, params(P1, T, P3))), subst(T, T2), depth(T2, D), maxdepth(Dmax), D < Dmax.
subcons(A, type(C, params( P1, P2, T2))) :- subcons(A, type(C, params(P1, P2, T))), subst(T, T2), depth(T2, D), maxdepth(Dmax), D < Dmax.
% ---------------------------------------------------------------------------------------------
% ADAPT: N <. C<P1..Pn>, N <: C<P'1..P'n> ==> P1 =. P'1, ..., Pn =. P'n
%
% A class type constrained below a parameterized type must agree with that type argument for
% argument, read off its position in the hierarchy. This is where an extends relation's type
% arguments do their work: `Matrix <. Vector<X>` together with
% `Matrix <: Vector<Vector<Integer>>` forces X = Vector<Integer>. The parameter equalities
% themselves are extracted by REDUCE.
% ---------------------------------------------------------------------------------------------
equalcons(type(D,P3), type(D,P2)) :- subcons(type(C,P), type(D, P2)), subtype(type(C, P), type(D, P3)).
% ---------------------------------------------------------------------------------------------
% REDUCE: C<P1..Pn> =. C<P'1..P'n> ==> Pi =. P'i
% Same class on both sides: equate the arguments pairwise. One rule per position per arity.
% ---------------------------------------------------------------------------------------------
equalcons(P1, PP1) :- equalcons(type(C, params(P1)), type(C, params(PP1))).
equalcons(P1, PP1) :- equalcons(type(C, params(P1, P2)), type(C, params(PP1, PP2))).
equalcons(P2, PP2) :- equalcons(type(C, params(P1, P2)), type(C, params(PP1, PP2))).
equalcons(P1, PP1) :- equalcons(type(C, params(P1, P2, P3)), type(C, params(PP1, PP2, PP3))).
equalcons(P2, PP2) :- equalcons(type(C, params(P1, P2, P3)), type(C, params(PP1, PP2, PP3))).
equalcons(P3, PP3) :- equalcons(type(C, params(P1, P2, P3)), type(C, params(PP1, PP2, PP3))).
% ---------------------------------------------------------------------------------------------
% SUPER: N <. a, N <: N1..Nn ==> for one m: a =. Nm
%
% A placeholder with a class type as a *lower* bound must be one of that type's supertypes - the
% solver picks which. Written as a cardinality constraint over the candidates, the ASP form of
% the figure's "for one m" conclusion. If no subtype/2 fact matches N, the candidate set is empty
% and "== 1" makes the program unsatisfiable - which is why the extends relations must cover
% every type that appears as a lower bound.
% ---------------------------------------------------------------------------------------------
{ equalcons(tph(A), type(D, DP)): subtype(type(C, CP), type(D, DP)) } == 1 :- subcons(type(C, CP), tph(A)).
% ---------------------------------------------------------------------------------------------
% SOLUTION-GEN: a <. N, ... ==> for one m: a =. Nm
% Offer each upper bound of a placeholder as a candidate assignment. A choice rule rather than a
% cardinality one: the solver may take it or leave it here, and SOLUTION-REQUIREMENT below is
% what insists that something is eventually chosen.
% ---------------------------------------------------------------------------------------------
{ equalcons(tph(A), type(T,P)) } :- subcons(tph(A), type(T,P)).
% SOLUTION-REQUIREMENT: every placeholder that occurs in a constraint must end up with a unifier.
% Commented out in the figure - see the surrounding text, which discusses this formulation.
:- subcons(tph(A), _), not sigma(tph(A), _).
% ---------------------------------------------------------------------------------------------
% SOLUTION: a =. G ==> sigma(a) = G
%
% Only for a *ground* G: "not tphs(_, P)" rejects a type whose arguments still contain a
% placeholder (tphs/2 is defined in PART 3). This single guard is also what restricts SUBST, and
% with it every Subst-* rule, to placeholder-free types.
% ---------------------------------------------------------------------------------------------
tphs( P ) :- equalcons(tph(A), type(C, P)).
sigma(tph(A), type(C,P)) :- equalcons(tph(A), type(C, P)), not tphs(_, P).
% ---------------------------------------------------------------------------------------------
% FAIL-SUBTYPE: G1 <. G2, G1 not<: G2 ==> fail
%
% Compares class *names* (namedSubtype), where the figure compares whole types. That reads like a
% gap but is not one in practice, because ADAPT covers the arguments: given
% Vector<String> <. Vector<Integer>, ADAPT plus S-REFL derive
% Vector<String> =. Vector<Integer>, REDUCE splits that into String =. Integer, and FAIL-EQUALS
% below rejects it on the differing head names. Verified - that constraint set is UNSATISFIABLE
% with or without the added rule. No counterexample to the name-only form has been constructed;
% if one exists it needs a ground pair that ADAPT cannot fire on.
% ---------------------------------------------------------------------------------------------
:- subcons(type(C, CP), type(D, DP)), not namedSubtype(C, D).
% ---------------------------------------------------------------------------------------------
% FAIL-EQUALS: G1 =. G2, G1 != G2 ==> fail
%
% The appendix implements this by comparing head class names only:
% ---------------------------------------------------------------------------------------------
:- equalcons(type(C, CP), type(D, DP)), C != D.
% THIS RULE IS THE ONE ADDITION TO THE APPENDIX PROGRAM: on ground terms the whole type can be
% compared, type arguments included, which is what the figure's rule actually says.
%
% Where it earns its keep is *arity*, not argument values. Two types with the same class name but
% different parameter counts are paired by neither rule above: the name-only rule sees C == C, and
% REDUCE has no rule matching null against params(...), or params(P1) against params(P1,P2). So
% java.util.Vector =. java.util.Vector<java.lang.Integer>
% is accepted by the appendix program and rejected here - see ../../../../test_input3/arity-mismatch.cons.
% This is exactly the raw-versus-parameterized confusion that arises if extends relations are ever
% emitted in both erased and parameterized form.
%
% Argument *values* are already handled without this rule, via ADAPT + REDUCE + the name-only
% FAIL-EQUALS - see the note on FAIL-SUBTYPE above.
%
% The restriction to ground terms is required for soundness, not an optimisation - Box<a> =. Box<b>
% is perfectly satisfiable and must not be rejected before a and b have been substituted.
% groundType/1 is defined in PART 3.
:- equalcons(S, T), groundType(S), groundType(T), S != T.
% ---------------------------------------------------------------------------------------------
% Anti Cycle Conditions - BUILD, CONNECT, FAIL-CYCLE.
%
% BUILD: a =. C<..b..> ==> a -> b
% CONNECT: a -> b, b -> c ==> a -> c
% FAIL-CYCLE: a -> a ==> fail
%
% An assignment whose right-hand side contains the placeholder being assigned has no finite
% solution. Note these are integrity constraints, so they are only evaluated *after* grounding -
% the maxdepth guard on SUBST-PARAM is what gets the program that far.
% ---------------------------------------------------------------------------------------------
connected(A,B) :- equalcons(tph(A), type(_,params(tph(B)))).
connected(A,B) :- equalcons(tph(A), type(_,params(tph(B),_))).
connected(A,B) :- equalcons(tph(A), type(_,params(_,tph(B)))).
connected(A,B) :- equalcons(tph(A), type(_,params(tph(B),_,_))).
connected(A,B) :- equalcons(tph(A), type(_,params(_,tph(B),_))).
connected(A,B) :- equalcons(tph(A), type(_,params(_,_,tph(B)))).
% CONNECT. The appendix prints this as `connected(A,C) :- connected(A,B), connected(A,C).`, whose
% second body literal repeats the head instead of chaining through B - as printed it derives
% nothing, leaving FAIL-CYCLE able to catch only *direct* self-reference (a =. C<..a..>) and not
% a -> b -> a. Corrected here to the figure's rule, `a -> b, b -> c ==> a -> c`.
%
% Note this is a correctness backstop only. FAIL-CYCLE is an integrity constraint, so it runs
% after grounding - and on a cyclic constraint set grounding is exactly what does not terminate.
% cycleCheck.lp is what catches those, before the solve.
connected(A,C) :- connected(A,B), connected(B,C).
% FAIL-CYCLE.
:- connected(A,A).
%==============================================================================================
% PART 3 - HELPERS
% No counterpart in the paper; these compute the side conditions its rules are stated with.
%==============================================================================================
% ---------------------------------------------------------------------------------------------
% depth/1 and depth/2 - the nesting depth of a type, used only by SUBST-PARAM's maxdepth guard.
%
% depth/1 marks a term as one whose depth is worth computing; it is seeded from the substituted
% types and pushed down into type arguments, so the measurement is confined to terms that can
% actually reach a Subst-Param rule. depth/2 then reports a depth for each such term: 0 for a
% type with no arguments, and for a parameterized type the sum of its arguments' depths plus one.
% (A sum rather than a maximum, so a wide type counts as deeper than a narrow one of the same
% nesting - a coarser bound than the name "depth" suggests, but a finite one, which is the point.)
% ---------------------------------------------------------------------------------------------
depth(T2) :- subst(T, T2).
depth(T2) :- subst(_, T2).
depth(T) :- depth(type(A, params(T))).
depth(T) :- depth(type(A, params(T, T1))).
depth(T1) :- depth(type(A, params(T, T1))).
depth(T) :- depth(type(A, params(T, T1, T2))).
depth(T1) :- depth(type(A, params(T, T1, T2))).
depth(T2) :- depth(type(A, params(T, T1, T2))).
depth(type(A, null), 0) :- depth(type(A, null)).
depth(type(A, params(T)), D+1) :- depth(type(A, params(T))), depth(T, D).
depth(type(A, params(T, T1)), D+D1+1) :- depth(type(A, params(T, T1))), depth(T, D), depth(T1, D1).
depth(type(A, params(T, T1, T2)), D+D1+D2+1) :- depth(type(A, params(T, T1, T2))), depth(T, D), depth(T1, D1), depth(T2, D2).
% ---------------------------------------------------------------------------------------------
% groundType/1 - the paper's G: a type term occurring in the constraint set that contains no
% placeholder at any depth. Used by the added Fail-Equals rule.
%
% Defined positively - built up from argument-free types rather than as
% "typeTerm(T), not containsTph(T)" - so the grounder can evaluate it bottom-up. Phrased with
% negation it would sit in a negative cycle through subcons/2 and the grounder would have to
% assume it might hold for every term, which makes it useless as a guard.
% ---------------------------------------------------------------------------------------------
groundType(type(C, null)) :- typeTerm(type(C, null)).
groundType(type(C, params(P1))) :- typeTerm(type(C, params(P1))), groundType(P1).
groundType(type(C, params(P1, P2))) :- typeTerm(type(C, params(P1, P2))), groundType(P1), groundType(P2).
groundType(type(C, params(P1, P2, P3))) :- typeTerm(type(C, params(P1, P2, P3))), groundType(P1), groundType(P2), groundType(P3).
% typeTerm/1 - every type term occurring anywhere in a constraint, including nested arguments.
typeTerm(S) :- subcons(S, _).
typeTerm(T) :- subcons(_, T).
typeTerm(S) :- equalcons(S, _).
typeTerm(T) :- equalcons(_, T).
typeTerm(P1) :- typeTerm(type(_, params(P1))).
typeTerm(P1) :- typeTerm(type(_, params(P1, _))).
typeTerm(P2) :- typeTerm(type(_, params(_, P2))).
typeTerm(P1) :- typeTerm(type(_, params(P1, _, _))).
typeTerm(P2) :- typeTerm(type(_, params(_, P2, _))).
typeTerm(P3) :- typeTerm(type(_, params(_, _, P3))).
% ---------------------------------------------------------------------------------------------
% tphs/1 and tphs/2 - "this parameter list contains a placeholder", the side condition SOLUTION
% uses to accept only ground types. tphs(P) marks a parameter list under inspection; tphs(A, P)
% says placeholder A occurs somewhere in P. One rule per position per arity, recursing through
% nested class types.
% ---------------------------------------------------------------------------------------------
tphs(tph(P), params(tph(P))) :- tphs( params(tph(P))).
tphs(P) :- tphs( params(type(C, P))).
tphs(tph(A), params(type(C, P))) :- tphs( params(type(C, P))), tphs(tph(A), P).
tphs(tph(P), params(X, tph(P))) :- tphs( params(X, tph(P))).
tphs(tph(P), params(tph(P), X)) :- tphs( params(tph(P), X)).
tphs(P) :- tphs( params(X, type(C, P))).
tphs(P) :- tphs( params(type(C, P), X)).
tphs(tph(A), params(X, type(C, P))) :- tphs( params(X, type(C, P))), tphs(tph(A), P).
tphs(tph(A), params(type(C, P), X)) :- tphs( params(type(C, P), X)), tphs(tph(A), P).
tphs(tph(P), params(tph(P), X, Y)) :- tphs( params(tph(P), X, Y)).
tphs(tph(P), params(X, tph(P), Y)) :- tphs( params(X, tph(P), Y)).
tphs(tph(P), params(X,Y,tph(P))) :- tphs( params(X, Y, tph(P))).
tphs(P) :- tphs( params(type(C, P), X, Y)).
tphs(P) :- tphs( params(X, type(C, P),Y)).
tphs(P) :- tphs( params(X,Y,type(C, P))).
tphs(tph(A), params(type(C, P), X, Y)) :- tphs( params(type(C, P), X, Y)), tphs(tph(A), P).
tphs(tph(A), params(X, type(C, P), Y)) :- tphs( params(X, type(C, P), Y)), tphs(tph(A), P).
tphs(tph(A), params(X, Y, type(C, P))) :- tphs( params(X, Y, type(C, P))), tphs(tph(A), P).
-153
View File
@@ -1,153 +0,0 @@
% TEST INPUT
%orCons(undCons(subcons(tph("_b"),type("java.security.Permission",null)),undCons(subcons(tph("_a"),type("java.util.PropertyPermissionCollection",null)), null)),orCons(undCons(subcons(tph("_a"),type("sun.java2d.marlin.stats.Histogram",null)),undCons(subcons(tph("_b"),type("int",null)), null)),orCons(undCons(subcons(tph("_a"),type("com.sun.jndi.ldap.LdapAttribute",null)),undCons(subcons(tph("_b"),type("java.lang.Object",null)), null)),orCons(undCons(subcons(tph("_b"),type("java.math.BigInteger",null)),undCons(subcons(tph("_a"),type("java.math.BigInteger",null)), null)),orCons(undCons(subcons(tph("_a"),type("com.sun.org.apache.xerces.internal.impl.xs.XSModelImpl$XSNamespaceItemListIterator",null)),undCons(subcons(tph("_b"),type("java.lang.Object",null)), null)),orCons(undCons(subcons(tph("_b"),type("com.sun.org.apache.xml.internal.security.keys.storage.StorageResolverSpi",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.AbstractList",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.HashSet",null)), null)),orCons(undCons(subcons(tph("_b"),type("sun.security.util.math.IntegerModuloP",null)),undCons(subcons(tph("_a"),type("sun.security.util.math.intpoly.IntegerPolynomial$Element",null)), null)),orCons(undCons(subcons(tph("_b"),type("java.awt.geom.Point2D",null)),undCons(subcons(tph("_a"),type("java.awt.geom.Rectangle2D",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.AbstractQueue",null)), null)),orCons(undCons(subcons(tph("_b"),type("double",null)),undCons(subcons(tph("_a"),type("java.util.concurrent.atomic.DoubleAdder",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.Collections$AsLIFOQueue",null)), null)),orCons(undCons(subcons(tph("_b"),type("com.sun.org.apache.xml.internal.security.keys.content.keyvalues.DSAKeyValue",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xml.internal.security.keys.KeyInfo",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.Collections$EmptyListIterator",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.AbstractList$ListItr",null)), null)),orCons(undCons(subcons(tph("_b"),type("java.math.BigDecimal",null)),undCons(subcons(tph("_a"),type("java.math.BigDecimal",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.Collections$CheckedList$1",null)), null)),orCons(undCons(subcons(tph("_a"),type("sun.security.provider.PolicyParser",null)),undCons(subcons(tph("_b"),type("sun.security.provider.PolicyParser$GrantEntry",null)), null)),orCons(undCons(subcons(tph("_a"),type("sun.swing.AccumulativeRunnable",null)),undCons(subcons(tph("_b"),tph("_T_array")), null)),orCons(undCons(subcons(tph("_a"),type("com.sun.jmx.remote.internal.ArrayQueue",null)),undCons(subcons(tph("_b"),tph("_T")), null)),orCons(undCons(subcons(tph("_b"),type("javax.management.relation.Role",null)),undCons(subcons(tph("_a"),type("javax.management.relation.RoleList",null)), null)),orCons(undCons(subcons(tph("_b"),type("com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SKI",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xml.internal.security.keys.content.X509Data",null)), null)),orCons(undCons(subcons(tph("_b"),type("javax.xml.datatype.Duration",null)),undCons(subcons(tph("_a"),type("javax.xml.datatype.XMLGregorianCalendar",null)), null)),orCons(undCons(subcons(tph("_a"),type("java.util.concurrent.ConcurrentHashMap$EntrySetView",null)),undCons(subcons(tph("_b"),type("java.lang.Object",null)), null)),orCons(undCons(subcons(tph("_b"),type("com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509IssuerSerial",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xml.internal.security.keys.content.X509Data",null)), null)),orCons(undCons(subcons(tph("_b"),type("javax.swing.tree.MutableTreeNode",null)),undCons(subcons(tph("_a"),type("javax.swing.tree.DefaultMutableTreeNode",null)), null)),orCons(undCons(subcons(tph("_b"),type("sun.awt.image.ImageFetchable",null)),undCons(subcons(tph("_a"),type("sun.awt.image.ImageFetcher",null)), null)),orCons(undCons(subcons(tph("_b"),type("javax.management.Attribute",null)),undCons(subcons(tph("_a"),type("javax.management.AttributeList",null)), null)),orCons(undCons(subcons(tph("_b"),type("double",null)),undCons(subcons(tph("_a"),type("java.awt.image.renderable.ParameterBlock",null)), null)),orCons(undCons(subcons(tph("_a"),type("java.util.concurrent.CopyOnWriteArrayList$COWSubListIterator",null)),undCons(subcons(tph("_b"),tph("_E")), null)),orCons(undCons(subcons(tph("_b"),type("com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509CRL",null)),undCons(subcons(tph("_a"),type(Line truncated
%orCons(undCons(subcons(tph("_a"),type("javax.print.attribute.HashAttributeSet",null)),undCons(subcons(tph("_c"),type("javax.print.attribute.Attribute",null)), null)),orCons(undCons(subcons(tph("_c"),type("javax.swing.GroupLayout$ComponentInfo",null)),undCons(subcons(tph("_a"),type("javax.swing.GroupLayout$LinkInfo",null)), null)),orCons(undCons(subcons(tph("_a"),type("java.util.ArrayList$SubList$1",null)),undCons(subcons(tph("_c"),tph("_E")), null)),orCons(undCons(subcons(tph("_c"),type("com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SKI",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xml.internal.security.keys.content.X509Data",null)), null)),orCons(undCons(subcons(tph("_a"),type("java.util.concurrent.ConcurrentHashMap$EntrySetView",null)),undCons(subcons(tph("_c"),type("java.lang.Object",null)), null)),orCons(undCons(subcons(tph("_c"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.Set",null)), null)),orCons(undCons(subcons(tph("_c"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.ArrayList$ListItr",null)), null)),orCons(undCons(subcons(tph("_c"),type("java.awt.geom.Point2D",null)),undCons(subcons(tph("_a"),type("java.awt.geom.Rectangle2D",null)), null)),orCons(undCons(subcons(tph("_c"),type("javax.xml.datatype.Duration",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl",null)), null)),orCons(undCons(subcons(tph("_a"),type("java.awt.image.renderable.ParameterBlock",null)),undCons(subcons(tph("_c"),type("int",null)), null)),orCons(undCons(subcons(tph("_c"),type("java.security.Permission",null)),undCons(subcons(tph("_a"),type("java.util.PropertyPermissionCollection",null)), null)),orCons(undCons(subcons(tph("_c"),type("javax.swing.Action",null)),undCons(subcons(tph("_a"),type("javax.swing.JMenu",null)), null)),orCons(undCons(subcons(tph("_c"),type("com.sun.org.apache.xml.internal.security.keys.content.SPKIData",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xml.internal.security.keys.KeyInfo",null)), null)),orCons(undCons(subcons(tph("_c"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.concurrent.ConcurrentSkipListSet",null)), null)),orCons(undCons(subcons(tph("_a"),type("javax.print.attribute.AttributeSetUtilities$UnmodifiableAttributeSet",null)),undCons(subcons(tph("_c"),type("javax.print.attribute.Attribute",null)), null)),orCons(undCons(subcons(tph("_a"),type("sun.tools.jar.Main$1",null)),undCons(subcons(tph("_c"),type("java.util.zip.ZipEntry",null)), null)),orCons(undCons(subcons(tph("_c"),type("java.security.Permission",null)),undCons(subcons(tph("_a"),type("javax.management.MBeanServerPermissionCollection",null)), null)),orCons(undCons(subcons(tph("_c"),type("java.security.Permission",null)),undCons(subcons(tph("_a"),type("java.security.UnresolvedPermissionCollection",null)), null)),orCons(undCons(subcons(tph("_c"),tph("_V")),undCons(subcons(tph("_a"),type("java.util.concurrent.ConcurrentHashMap$ValuesView",null)), null)), null))))))))))))))))))).
%orCons(undCons(subcons(tph("_b"),type("java.security.Permission",null)),undCons(subcons(tph("_a"),type("java.util.PropertyPermissionCollection",null)), null)),orCons(undCons(subcons(tph("_a"),type("sun.java2d.marlin.stats.Histogram",null)),undCons(subcons(tph("_b"),type("int",null)), null)),orCons(undCons(subcons(tph("_a"),type("com.sun.jndi.ldap.LdapAttribute",null)),undCons(subcons(tph("_b"),type("java.lang.Object",null)), null)),orCons(undCons(subcons(tph("_b"),type("java.math.BigInteger",null)),undCons(subcons(tph("_a"),type("java.math.BigInteger",null)), null)),orCons(undCons(subcons(tph("_a"),type("com.sun.org.apache.xerces.internal.impl.xs.XSModelImpl$XSNamespaceItemListIterator",null)),undCons(subcons(tph("_b"),type("java.lang.Object",null)), null)),orCons(undCons(subcons(tph("_b"),type("com.sun.org.apache.xml.internal.security.keys.storage.StorageResolverSpi",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.AbstractList",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.HashSet",null)), null)),orCons(undCons(subcons(tph("_b"),type("sun.security.util.math.IntegerModuloP",null)),undCons(subcons(tph("_a"),type("sun.security.util.math.intpoly.IntegerPolynomial$Element",null)), null)),orCons(undCons(subcons(tph("_b"),type("java.awt.geom.Point2D",null)),undCons(subcons(tph("_a"),type("java.awt.geom.Rectangle2D",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.AbstractQueue",null)), null)),orCons(undCons(subcons(tph("_b"),type("double",null)),undCons(subcons(tph("_a"),type("java.util.concurrent.atomic.DoubleAdder",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.Collections$AsLIFOQueue",null)), null)),orCons(undCons(subcons(tph("_b"),type("com.sun.org.apache.xml.internal.security.keys.content.keyvalues.DSAKeyValue",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xml.internal.security.keys.KeyInfo",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.Collections$EmptyListIterator",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.AbstractList$ListItr",null)), null)),orCons(undCons(subcons(tph("_b"),type("java.math.BigDecimal",null)),undCons(subcons(tph("_a"),type("java.math.BigDecimal",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.Collections$CheckedList$1",null)), null)),orCons(undCons(subcons(tph("_a"),type("sun.security.provider.PolicyParser",null)),undCons(subcons(tph("_b"),type("sun.security.provider.PolicyParser$GrantEntry",null)), null)),orCons(undCons(subcons(tph("_a"),type("sun.swing.AccumulativeRunnable",null)),undCons(subcons(tph("_b"),tph("_T_array")), null)),orCons(undCons(subcons(tph("_a"),type("com.sun.jmx.remote.internal.ArrayQueue",null)),undCons(subcons(tph("_b"),tph("_T")), null)),orCons(undCons(subcons(tph("_b"),type("javax.management.relation.Role",null)),undCons(subcons(tph("_a"),type("javax.management.relation.RoleList",null)), null)),orCons(undCons(subcons(tph("_b"),type("com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SKI",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xml.internal.security.keys.content.X509Data",null)), null)),orCons(undCons(subcons(tph("_b"),type("javax.xml.datatype.Duration",null)),undCons(subcons(tph("_a"),type("javax.xml.datatype.XMLGregorianCalendar",null)), null)),orCons(undCons(subcons(tph("_a"),type("java.util.concurrent.ConcurrentHashMap$EntrySetView",null)),undCons(subcons(tph("_b"),type("java.lang.Object",null)), null)),orCons(undCons(subcons(tph("_b"),type("com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509IssuerSerial",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xml.internal.security.keys.content.X509Data",null)), null)),orCons(undCons(subcons(tph("_b"),type("javax.swing.tree.MutableTreeNode",null)),undCons(subcons(tph("_a"),type("javax.swing.tree.DefaultMutableTreeNode",null)), null)),orCons(undCons(subcons(tph("_b"),type("sun.awt.image.ImageFetchable",null)),undCons(subcons(tph("_a"),type("sun.awt.image.ImageFetcher",null)), null)),orCons(undCons(subcons(tph("_b"),type("javax.management.Attribute",null)),undCons(subcons(tph("_a"),type("javax.management.AttributeList",null)), null)),orCons(undCons(subcons(tph("_b"),type("double",null)),undCons(subcons(tph("_a"),type("java.awt.image.renderable.ParameterBlock",null)), null)),orCons(undCons(subcons(tph("_a"),type("java.util.concurrent.CopyOnWriteArrayList$COWSubListIterator",null)),undCons(subcons(tph("_b"),tph("_E")), null)),orCons(undCons(subcons(tph("_b"),type("com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509CRL",null)),undCons(subcons(tph("_a"),type(Line truncated
%orCons(undCons(subcons(tph("_a"),type("javax.print.attribute.HashAttributeSet",null)),undCons(subcons(tph("_c"),type("javax.print.attribute.Attribute",null)), null)),orCons(undCons(subcons(tph("_c"),type("javax.swing.GroupLayout$ComponentInfo",null)),undCons(subcons(tph("_a"),type("javax.swing.GroupLayout$LinkInfo",null)), null)),orCons(undCons(subcons(tph("_a"),type("java.util.ArrayList$SubList$1",null)),undCons(subcons(tph("_c"),tph("_E")), null)),orCons(undCons(subcons(tph("_c"),type("com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SKI",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xml.internal.security.keys.content.X509Data",null)), null)),orCons(undCons(subcons(tph("_a"),type("java.util.concurrent.ConcurrentHashMap$EntrySetView",null)),undCons(subcons(tph("_c"),type("java.lang.Object",null)), null)),orCons(undCons(subcons(tph("_c"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.Set",null)), null)),orCons(undCons(subcons(tph("_c"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.ArrayList$ListItr",null)), null)),orCons(undCons(subcons(tph("_c"),type("java.awt.geom.Point2D",null)),undCons(subcons(tph("_a"),type("java.awt.geom.Rectangle2D",null)), null)),orCons(undCons(subcons(tph("_c"),type("javax.xml.datatype.Duration",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl",null)), null)),orCons(undCons(subcons(tph("_a"),type("java.awt.image.renderable.ParameterBlock",null)),undCons(subcons(tph("_c"),type("int",null)), null)),orCons(undCons(subcons(tph("_c"),type("java.security.Permission",null)),undCons(subcons(tph("_a"),type("java.util.PropertyPermissionCollection",null)), null)),orCons(undCons(subcons(tph("_c"),type("javax.swing.Action",null)),undCons(subcons(tph("_a"),type("javax.swing.JMenu",null)), null)),orCons(undCons(subcons(tph("_c"),type("com.sun.org.apache.xml.internal.security.keys.content.SPKIData",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xml.internal.security.keys.KeyInfo",null)), null)),orCons(undCons(subcons(tph("_c"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.concurrent.ConcurrentSkipListSet",null)), null)),orCons(undCons(subcons(tph("_a"),type("javax.print.attribute.AttributeSetUtilities$UnmodifiableAttributeSet",null)),undCons(subcons(tph("_c"),type("javax.print.attribute.Attribute",null)), null)),orCons(undCons(subcons(tph("_a"),type("sun.tools.jar.Main$1",null)),undCons(subcons(tph("_c"),type("java.util.zip.ZipEntry",null)), null)),orCons(undCons(subcons(tph("_c"),type("java.security.Permission",null)),undCons(subcons(tph("_a"),type("javax.management.MBeanServerPermissionCollection",null)), null)),orCons(undCons(subcons(tph("_c"),type("java.security.Permission",null)),undCons(subcons(tph("_a"),type("java.security.UnresolvedPermissionCollection",null)), null)),orCons(undCons(subcons(tph("_c"),tph("_V")),undCons(subcons(tph("_a"),type("java.util.concurrent.ConcurrentHashMap$ValuesView",null)), null)), null))))))))))))))))))).
orCons(undCons(subcons(tph("_b"),type("java.security.Permission",null)),undCons(subcons(tph("_a"),type("java.util.PropertyPermissionCollection",null)), null)),orCons(undCons(subcons(tph("_a"),type("sun.java2d.marlin.stats.Histogram",null)),undCons(subcons(tph("_b"),type("int",null)), null)),orCons(undCons(subcons(tph("_a"),type("com.sun.jndi.ldap.LdapAttribute",null)),undCons(subcons(tph("_b"),type("java.lang.Object",null)), null)),orCons(undCons(subcons(tph("_b"),type("java.math.BigInteger",null)),undCons(subcons(tph("_a"),type("java.math.BigInteger",null)), null)),orCons(undCons(subcons(tph("_a"),type("com.sun.org.apache.xerces.internal.impl.xs.XSModelImpl$XSNamespaceItemListIterator",null)),undCons(subcons(tph("_b"),type("java.lang.Object",null)), null)),orCons(undCons(subcons(tph("_b"),type("com.sun.org.apache.xml.internal.security.keys.storage.StorageResolverSpi",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.AbstractList",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.HashSet",null)), null)),orCons(undCons(subcons(tph("_b"),type("sun.security.util.math.IntegerModuloP",null)),undCons(subcons(tph("_a"),type("sun.security.util.math.intpoly.IntegerPolynomial$Element",null)), null)),orCons(undCons(subcons(tph("_b"),type("java.awt.geom.Point2D",null)),undCons(subcons(tph("_a"),type("java.awt.geom.Rectangle2D",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.AbstractQueue",null)), null)),orCons(undCons(subcons(tph("_b"),type("double",null)),undCons(subcons(tph("_a"),type("java.util.concurrent.atomic.DoubleAdder",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.Collections$AsLIFOQueue",null)), null)),orCons(undCons(subcons(tph("_b"),type("com.sun.org.apache.xml.internal.security.keys.content.keyvalues.DSAKeyValue",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xml.internal.security.keys.KeyInfo",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.Collections$EmptyListIterator",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.AbstractList$ListItr",null)), null)),orCons(undCons(subcons(tph("_b"),type("java.math.BigDecimal",null)),undCons(subcons(tph("_a"),type("java.math.BigDecimal",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.Collections$CheckedList$1",null)), null)),orCons(undCons(subcons(tph("_a"),type("sun.security.provider.PolicyParser",null)),undCons(subcons(tph("_b"),type("sun.security.provider.PolicyParser$GrantEntry",null)), null)),orCons(undCons(subcons(tph("_a"),type("sun.swing.AccumulativeRunnable",null)),undCons(subcons(tph("_b"),tph("_T_array")), null)),orCons(undCons(subcons(tph("_a"),type("com.sun.jmx.remote.internal.ArrayQueue",null)),undCons(subcons(tph("_b"),tph("_T")), null)),orCons(undCons(subcons(tph("_b"),type("javax.management.relation.Role",null)),undCons(subcons(tph("_a"),type("javax.management.relation.RoleList",null)), null)),orCons(undCons(subcons(tph("_b"),type("java.lang.String",null)),undCons(subcons(tph("_a"),type("javax.naming.Name",null)), null)),orCons(undCons(subcons(tph("_a"),type("javax.xml.datatype.Duration",null)),undCons(subcons(tph("_b"),type("javax.xml.datatype.Duration",null)), null)),orCons(undCons(subcons(tph("_b"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.concurrent.ConcurrentSkipListSet",null)), null)),orCons(undCons(subcons(tph("_b"),type("javax.accessibility.AccessibleRelation",null)),undCons(subcons(tph("_a"),type("javax.accessibility.AccessibleRelationSet",null)), null)),orCons(undCons(subcons(tph("_b"),type("java.awt.RenderingHints",null)),undCons(subcons(tph("_a"),type("java.awt.RenderingHints",null)), null)),orCons(undCons(subcons(tph("_b"),type("java.lang.Object",null)),undCons(subcons(tph("_a"),type("java.util.JumboEnumSet",null)), null)),orCons(undCons(subcons(tph("_b"),type("javax.xml.datatype.Duration",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xerces.internal.jaxp.datatype.DurationImpl",null)), null)),orCons(undCons(subcons(tph("_a"),type("javax.print.attribute.AttributeSetUtilities$UnmodifiableAttributeSet",null)),undCons(subcons(tph("_b"),type("javax.print.attribute.Attribute",null)), null)),orCons(undCons(subcons(tph("_a"),type("java.awt.geom.Rectangle2D",null)),undCons(subcons(tph("_b"),type("java.awt.geom.Rectangle2D",null)), null)),orCons(undCons(subcons(tph("_b"),type("java.awt.TrayIcon",null)),undCons(subcons(tph("_a"),type("java.awt.SystemTray",null)), null)),orCons(undCons(subcons(tph("_b"),type("java.awt.Component",null)),undCons(subcons(tph("_a"),type("sun.awt.X11.InfoWindow",null)), null)),orCons(undCons(subcons(tph("_a"),type("jaLine truncated
orCons(undCons(subcons(tph("_a"),type("javax.print.attribute.HashAttributeSet",null)),undCons(subcons(tph("_c"),type("javax.print.attribute.Attribute",null)), null)),orCons(undCons(subcons(tph("_c"),type("javax.swing.GroupLayout$ComponentInfo",null)),undCons(subcons(tph("_a"),type("javax.swing.GroupLayout$LinkInfo",null)), null)),orCons(undCons(subcons(tph("_a"),type("java.util.ArrayList$SubList$1",null)),undCons(subcons(tph("_c"),tph("_E")), null)),orCons(undCons(subcons(tph("_c"),type("com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SKI",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xml.internal.security.keys.content.X509Data",null)), null)),orCons(undCons(subcons(tph("_a"),type("java.util.concurrent.ConcurrentHashMap$EntrySetView",null)),undCons(subcons(tph("_c"),type("java.lang.Object",null)), null)),orCons(undCons(subcons(tph("_c"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.Set",null)), null)),orCons(undCons(subcons(tph("_c"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.ArrayList$ListItr",null)), null)),orCons(undCons(subcons(tph("_c"),type("java.awt.geom.Point2D",null)),undCons(subcons(tph("_a"),type("java.awt.geom.Rectangle2D",null)), null)),orCons(undCons(subcons(tph("_c"),type("javax.xml.datatype.Duration",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl",null)), null)),orCons(undCons(subcons(tph("_a"),type("java.awt.image.renderable.ParameterBlock",null)),undCons(subcons(tph("_c"),type("int",null)), null)),orCons(undCons(subcons(tph("_c"),type("java.security.Permission",null)),undCons(subcons(tph("_a"),type("java.util.PropertyPermissionCollection",null)), null)),orCons(undCons(subcons(tph("_c"),type("javax.swing.Action",null)),undCons(subcons(tph("_a"),type("javax.swing.JMenu",null)), null)),orCons(undCons(subcons(tph("_c"),type("com.sun.org.apache.xml.internal.security.keys.content.SPKIData",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xml.internal.security.keys.KeyInfo",null)), null)),orCons(undCons(subcons(tph("_c"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.concurrent.ConcurrentSkipListSet",null)), null)),orCons(undCons(subcons(tph("_a"),type("javax.print.attribute.AttributeSetUtilities$UnmodifiableAttributeSet",null)),undCons(subcons(tph("_c"),type("javax.print.attribute.Attribute",null)), null)),orCons(undCons(subcons(tph("_a"),type("sun.tools.jar.Main$1",null)),undCons(subcons(tph("_c"),type("java.util.zip.ZipEntry",null)), null)),orCons(undCons(subcons(tph("_c"),type("java.security.Permission",null)),undCons(subcons(tph("_a"),type("javax.management.MBeanServerPermissionCollection",null)), null)),orCons(undCons(subcons(tph("_c"),type("java.security.Permission",null)),undCons(subcons(tph("_a"),type("java.security.UnresolvedPermissionCollection",null)), null)),orCons(undCons(subcons(tph("_c"),tph("_V")),undCons(subcons(tph("_a"),type("java.util.concurrent.ConcurrentHashMap$ValuesView",null)), null)),orCons(undCons(subcons(tph("_a"),type("sun.java2d.marlin.stats.StatLong",null)),undCons(subcons(tph("_c"),type("int",null)), null)),orCons(undCons(subcons(tph("_c"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.Collections$CheckedList$1",null)), null)),orCons(undCons(subcons(tph("_c"),type("java.lang.String",null)),undCons(subcons(tph("_a"),type("javax.naming.Name",null)), null)),orCons(undCons(subcons(tph("_c"),type("com.sun.org.apache.xml.internal.security.keys.storage.StorageResolverSpi",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver",null)), null)),orCons(undCons(subcons(tph("_c"),type("javax.print.attribute.Attribute",null)),undCons(subcons(tph("_a"),type("javax.print.attribute.AttributeSet",null)), null)),orCons(undCons(subcons(tph("_a"),type("javax.management.relation.RoleUnresolvedList",null)),undCons(subcons(tph("_c"),type("javax.management.relation.RoleUnresolved",null)), null)),orCons(undCons(subcons(tph("_a"),type("javax.swing.JMenu",null)),undCons(subcons(tph("_c"),type("java.awt.Component",null)), null)),orCons(undCons(subcons(tph("_c"),type("javax.print.attribute.Attribute",null)),undCons(subcons(tph("_a"),type("javax.print.attribute.PrintJobAttributeSet",null)), null)),orCons(undCons(subcons(tph("_c"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.ArrayList",null)), null)),orCons(undCons(subcons(tph("_c"),type("com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SubjectName",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xml.internal.security.keys.content.X509Data",null)), null)),orCons(undCons(subcons(tph("_a"),type("javax.print.attribute.standard.JobStateReasons",null)),undCons(subcons(tph("_c"),type("java.lang.Object",null)), null)),orCons(undCons(subcons(tph("_c"),type("char",null)),undCons(subcons(tph("_a"),type("java.awt.image.renderable.ParameterBlock",null)), null)),orCons(undCons(subcons(tph("_a"),type("java.awt.Rectangle",null)),undCons(subLine truncated
orCons(undCons(subcons(tph("_d"),type("com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SubjectName",null)),undCons(subcons(tph("_a"),type("com.sun.org.apache.xml.internal.security.keys.content.X509Data",null)), null)),orCons(undCons(subcons(tph("_d"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.Collections$SetFromMap",null)), null)),orCons(undCons(subcons(tph("_a"),type("javax.swing.JPopupMenu",null)),undCons(subcons(tph("_d"),type("javax.swing.JMenuItem",null)), null)),orCons(undCons(subcons(tph("_a"),type("java.util.stream.IntStream$Builder",null)),undCons(subcons(tph("_d"),type("int",null)), null)),orCons(undCons(subcons(tph("_a"),type("java.awt.RenderingHints",null)),undCons(subcons(tph("_d"),type("java.awt.RenderingHints",null)), null)),orCons(undCons(subcons(tph("_d"),type("long",null)),undCons(subcons(tph("_a"),type("java.awt.image.renderable.ParameterBlock",null)), null)),orCons(undCons(subcons(tph("_a"),type("javax.accessibility.AccessibleStateSet",null)),undCons(subcons(tph("_d"),type("javax.accessibility.AccessibleState",null)), null)),orCons(undCons(subcons(tph("_d"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.Collections$CheckedList$1",null)), null)),orCons(undCons(subcons(tph("_a"),type("java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue",null)),undCons(subcons(tph("_d"),type("java.lang.Runnable",null)), null)),orCons(undCons(subcons(tph("_a"),type("java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue",null)),undCons(subcons(tph("_d"),type("java.lang.Object",null)), null)),orCons(undCons(subcons(tph("_d"),type("java.awt.geom.Point2D",null)),undCons(subcons(tph("_a"),type("java.awt.geom.Rectangle2D",null)), null)),orCons(undCons(subcons(tph("_a"),type("javax.swing.JMenu",null)),undCons(subcons(tph("_d"),type("java.lang.String",null)), null)),orCons(undCons(subcons(tph("_a"),type("javax.naming.CompositeName",null)),undCons(subcons(tph("_d"),type("java.lang.String",null)), null)),orCons(undCons(subcons(tph("_d"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.AbstractQueue",null)), null)),orCons(undCons(subcons(tph("_a"),type("com.sun.org.apache.xerces.internal.dom.DOMStringListImpl",null)),undCons(subcons(tph("_d"),type("java.lang.String",null)), null)),orCons(undCons(subcons(tph("_a"),type("java.awt.List",null)),undCons(subcons(tph("_d"),type("java.lang.String",null)), null)),orCons(undCons(subcons(tph("_d"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.Collection",null)), null)),orCons(undCons(subcons(tph("_a"),type("com.sun.org.apache.xalan.internal.xsltc.util.IntegerArray",null)),undCons(subcons(tph("_d"),type("int",null)), null)),orCons(undCons(subcons(tph("_d"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.concurrent.CopyOnWriteArrayList$COWIterator",null)), null)),orCons(undCons(subcons(tph("_a"),type("java.util.RegularEnumSet",null)),undCons(subcons(tph("_d"),type("java.lang.Object",null)), null)),orCons(undCons(subcons(tph("_a"),type("com.sun.org.apache.xerces.internal.impl.xs.XSModelImpl$XSNamespaceItemListIterator",null)),undCons(subcons(tph("_d"),type("com.sun.org.apache.xerces.internal.xs.XSNamespaceItem",null)), null)),orCons(undCons(subcons(tph("_d"),type("char",null)),undCons(subcons(tph("_a"),type("java.awt.image.renderable.ParameterBlock",null)), null)),orCons(undCons(subcons(tph("_a"),type("javax.naming.CompoundName",null)),undCons(subcons(tph("_d"),type("java.lang.String",null)), null)),orCons(undCons(subcons(tph("_d"),type("java.security.Permission",null)),undCons(subcons(tph("_a"),type("java.util.PropertyPermissionCollection",null)), null)),orCons(undCons(subcons(tph("_a"),type("com.sun.media.sound.SimpleInstrument",null)),undCons(subcons(tph("_d"),type("[Lcom.sun.media.sound.ModelPerformer;",null)), null)),orCons(undCons(subcons(tph("_d"),type("java.awt.Component",null)),undCons(subcons(tph("_a"),type("java.awt.Container",null)), null)),orCons(undCons(subcons(tph("_a"),type("sun.awt.image.ImageFetcher",null)),undCons(subcons(tph("_d"),type("sun.awt.image.ImageFetchable",null)), null)),orCons(undCons(subcons(tph("_d"),tph("_E")),undCons(subcons(tph("_a"),type("java.util.LinkedList",null)), null)),orCons(undCons(subcons(tph("_d"),type("javax.print.attribute.Attribute",null)),undCons(subcons(tph("_a"),type("javax.print.attribute.AttributeSetUtilities$UnmodifiableAttributeSet",null)), null)),orCons(undCons(subcons(tph("_d"),type("java.lang.CharSequence",null)),undCons(subcons(tph("_a"),type("java.util.StringJoiner",null)), null)),orCons(undCons(subcons(tph("_d"),type("java.security.Permission",null)),undCons(subcons(tph("_a"),type("java.security.UnresolvedPermissionCollection",null)), null)),orCons(undCons(subcons(tph("_a"),type("com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl$XSObjectListIterator",null)),undCons(subcons(tph("_d"),type("java.lang.Object",null)), null)),orCons(undCons(subcons(tph("_a"),type("jdk.internal.org.objectweb.asm.commons.InstructionAdapter",null)),undConLine truncated
:- sigma(tph("_b"), A), sigma(tph("_c"), A),sigma(tph("_d"), A).
subtype(type("java.lang.Boolean",null),type("java.lang.Object",null)):-subtype(type("java.lang.Boolean",null)).subtype(type("java.lang.String",null),type("java.lang.Object",null)):-subtype(type("java.lang.String",null)).subtype(type("java.lang.Integer",null),type("java.lang.Object",null)):-subtype(type("java.lang.Integer",null)).subtype(type("OrConsTest",null),type("java.lang.Object",null)):-subtype(type("OrConsTest",null)).subtype(type("MyPair",params(XX,XY)),type("Pair",params(XX,XX))):-subtype(type("MyPair",params(XX,XY))).subtype(type("Pair",params(XX,XY)),type("Object",null)):-subtype(type("Pair",params(XX,XY))).subtype(type("List",params(XX)),type("Object",null)):-subtype(type("List",params(XX))).subtype(type("Integer",null),type("Object",null)):-subtype(type("Integer",null)).subtype(type("String",null),type("Object",null)):-subtype(type("String",null)).
subtype(type("C1",null),type("java.lang.Object",null)):-subtype(type("C1",null)).
subtype(type("C2",null),type("java.lang.Object",null)):-subtype(type("C2",null)).
subtype(type("java.lang.Boolean",null),type("java.lang.Object",null)):-subtype(type("java.lang.Boolean",null)).subtype(type("java.lang.String",null),type("java.lang.Object",null)):-subtype(type("java.lang.String",null)).subtype(type("java.lang.Integer",null),type("java.lang.Object",null)):-subtype(type("java.lang.Integer",null)).subtype(type("OrConsTest",null),type("java.lang.Object",null)):-subtype(type("OrConsTest",null)).subtype(type("MyPair",params(XX,XY)),type("Pair",params(XX,XX))):-subtype(type("MyPair",params(XX,XY))).subtype(type("Pair",params(XX,XY)),type("Object",null)):-subtype(type("Pair",params(XX,XY))).subtype(type("List",params(XX)),type("Object",null)):-subtype(type("List",params(XX))).subtype(type("Integer",null),type("Object",null)):-subtype(type("Integer",null)).subtype(type("String",null),type("Object",null)):-subtype(type("String",null)).
%TODO: there is propably something wrong with the or-constraint generation
%%%%%
subtype(type("MyPair", params(X, Y)), type("Pair", params(Y, X))) :- subtype(type("MyPair", params(X, Y))).
subtype(type("ArrayList", params(X)), type("List", params(X))) :- subtype(type("ArrayList", params(X))).
subtype(type("List", params(X)), type("Object", null)) :- subtype(type("List", params(X))).
subtype(type("Integer", null), type("Object", null)) :- subtype(type("Integer", null)).
subtype(type("Matrix", null), type("Vector", params(type("Vector", params(type("Integer", null)))))) :- subtype(type("Matrix", null)).
subtype(type("Vector", params(X)), type("Object", null)) :- subtype(type("Vector", params(X))).
% Or-Constraints
undCons(A,B) :- orCons(undCons(A,B), null).
undCons(A,B); orCons(C,D) :- orCons(undCons(A,B), orCons(C,D)).
% undCons
subcons(A,B) :- undCons(subcons(A,B), _).
undCons(C,D) :- undCons(_, undCons(C,D)).
equalcons(A,B) :- undCons(equalcons(A,B), _).
undCons(B,C) :- undCons(A, undCons(B, C)).
% Subtyping
subtype(A, A) :- subtype(A). % reflexive
subtype(A, A) :- subtype(A, B). % reflexive
subtype(B) :- subtype(A, B). % transitive
subtype(A, C) :- subtype(A, B), subtype(B, C). % transitive
% named Subtyping
namedSubtype(A,B) :- subtype(type(A, AP), type(B, BP)).
% is reflexive and transitive because subtype it stems from subtype
% generate the subtype relations for every constraint where one is needed: (this could be optimized)
subtype(type(A, P)) :- subcons(_, type(A, P)).
subtype(type(A, P)) :- subcons(type(A, P), _).
% subst:
subst(tph(A), type(N,P)) :- equalcons(tph(A), type(N, P)).
% subst-L:
subcons(B,C) :- subst(A, B), subcons(A, C).
%subst-R:
subcons(C,B) :- subst(A, B), subcons(C, A).
%subst-Equal:
equalcons(B,C) :- subst(A, B), equalcons(A, C).
%swap:
equalcons(A,B) :- equalcons(B,A).
%unfold:
equalcons(T, T) :- equalcons(tph(_), type(_, params(T))).
equalcons(T, T) :- equalcons(tph(_), type(_, params(T, _))).
equalcons(T, T) :- equalcons(tph(_), type(_, params(_, T))).
equalcons(T, T) :- equalcons(tph(_), type(_, params(T, _, _))).
equalcons(T, T) :- equalcons(tph(_), type(_, params(_, T, _))).
equalcons(T, T) :- equalcons(tph(_), type(_, params(_, _, T))).
% Subst-Param:
subcons(A, type(C, params(T2))) :- subcons(A, type(C, params(T))), subst(T, T2).
subcons(A, type(C, params(T2, P2))) :- subcons(A, type(C, params(T, P2))), subst(T, T2).
subcons(A, type(C, params(P1, T2))) :- subcons(A, type(C, params(P1, T))), subst(T, T2).
subcons(A, type(C, params(T2, P2, P3))) :- subcons(A, type(C, params(T, P2, P3))), subst(T, T2).
subcons(A, type(C, params(P1, T2, P3))) :- subcons(A, type(C, params(P1, T, P3))), subst(T, T2).
subcons(A, type(C, params( P1, P2, T2))) :- subcons(A, type(C, params(P1, P2, T))), subst(T, T2).
% match
subcons(type(C, P1), type(D, P2)) :- subcons(tph(A), type(C, P1)), subcons(tph(A), type(D, P2)), namedSubtype(C, D).
% adopt
subcons(tph(A), type(C,P)) :- subcons(tph(A), tph(B)), subcons(tph(B), type(C,P)).
% adapt
equalcons(type(D,P3), type(D,P2)) :- subcons(type(C,P), type(D, P2)), subtype(type(C, P), type(D, P3)).
% reduce
equalcons(P1, PP1) :- equalcons(type(C, params(P1)), type(C, params(PP1))).
equalcons(P1, PP1) :- equalcons(type(C, params(P1, P2)), type(C, params(PP1, PP2))).
equalcons(P2, PP2) :- equalcons(type(C, params(P1, P2)), type(C, params(PP1, PP2))).
equalcons(P1, PP1) :- equalcons(type(C, params(P1, P2, P3)), type(C, params(PP1, PP2, PP3))).
equalcons(P2, PP2) :- equalcons(type(C, params(P1, P2, P3)), type(C, params(PP1, PP2, PP3))).
equalcons(P3, PP3) :- equalcons(type(C, params(P1, P2, P3)), type(C, params(PP1, PP2, PP3))).
% super
{ equalcons(tph(A), type(D, DP)): subtype(type(C, CP), type(D, DP)) } == 1 :- subcons(type(C, CP), tph(A)).
%equalcons(tph(A), type(C, CP)) :- subcons(type(C, CP), tph(A)), not subtype(type(C, CP),_).
%Solution-Gen
%subst(tph(A), typeVar(tph(A))) :- subcons(tph(A), type(C,P)), not sigma(tph(A), _).
%sigma2(tph(A), typeVar(tph(A))) :- subcons(tph(A), type(C,P)), not sigma(tph(A), _).
% here we check if there is a constraint a <. C, where there is no other Constraint. This is the solution-Gen rule
%Solution-Subst:
hasASubtype(tph(A), type(D,P2)) :- subcons(tph(A), type(C,P)), subcons(tph(A), type(D,P2)), namedSubtype(C, D), C != D.
equalcons(tph(A), type(C,P)) :- subcons(tph(A), type(C,P)), not hasASubtype(tph(A), type(C,P)).
%Solution:
tphs( P ) :- equalcons(tph(A), type(C, P)).
sigma(tph(A), type(C,P)) :- equalcons(tph(A), type(C, P)), not tphs(_, P).
% Fail
:- equalcons(tph(A), type(C, P)), tphs(tph(A), P). % fail for subst
:- equalcons(type(C, CP), type(D, DP)), C != D. % fail for reduce
:- subcons(type(C, CP), type(D, DP)), not namedSubtype(C, D). % fail for adapt
:- subcons(tph(A), type(D, DP)), subcons(tph(A), type(C, CP)), not namedSubtype(C, D), not namedSubtype(D, C). %Fail for match
%% Helpers
%tphs:
tphs(tph(P), params(tph(P))) :- tphs( params(tph(P))).
tphs(P) :- tphs( params(type(C, P))).
tphs(tph(A), params(type(C, P))) :- tphs( params(type(C, P))), tphs(tph(A), P).
tphs(tph(P), params(X, tph(P))) :- tphs( params(X, tph(P))).
tphs(tph(P), params(tph(P), X)) :- tphs( params(tph(P), X)).
tphs(P) :- tphs( params(X, type(C, P))).
tphs(P) :- tphs( params(type(C, P), X)).
tphs(tph(A), params(X, type(C, P))) :- tphs( params(X, type(C, P))), tphs(tph(A), P).
tphs(tph(A), params(type(C, P), X)) :- tphs( params(type(C, P), X)), tphs(tph(A), P).
tphs(tph(P), params(tph(P), X, Y)) :- tphs( params(tph(P), X, Y)).
tphs(tph(P), params(X, tph(P), Y)) :- tphs( params(X, tph(P), Y)).
tphs(tph(P), params(X,Y,tph(P))) :- tphs( params(X, Y, tph(P))).
tphs(P) :- tphs( params(type(C, P), X, Y)).
tphs(P) :- tphs( params(X, type(C, P),Y)).
tphs(P) :- tphs( params(X,Y,type(C, P))).
tphs(tph(A), params(type(C, P), X, Y)) :- tphs( params(type(C, P), X, Y)), tphs(tph(A), P).
tphs(tph(A), params(X, type(C, P), Y)) :- tphs( params(X, type(C, P), Y)), tphs(tph(A), P).
tphs(tph(A), params(X, Y, type(C, P))) :- tphs( params(X, Y, type(C, P))), tphs(tph(A), P).
#show sigma/2.
#show sigma2/2.
-155
View File
@@ -1,155 +0,0 @@
% TEST INPUT
orCons(undCons(subcons(tph("_AG"),tph("_AD")),undCons(equalcons(tph("_O"),type("C1",null)),undCons(equalcons(type("java.lang.Object",null),type("java.lang.Object",null)),undCons(equalcons(tph("_W"),type("C2",null)),undCons(subcons(tph("_O"),tph("_N")),undCons(subcons(tph("_W"),tph("_V")), null)))))), null).
orCons(undCons(subcons(tph("_N"),tph("_BC")),undCons(equalcons(tph("_AE"),type("C1",null)), null)),orCons(undCons(equalcons(tph("_AE"),type("C2",null)),undCons(subcons(tph("_V"),tph("_BC")), null)),orCons(undCons(equalcons(tph("_AE"),type("C2",null)),undCons(subcons(tph("_V"),tph("_BC")), null)),orCons(undCons(subcons(tph("_N"),tph("_BC")),undCons(equalcons(tph("_AE"),type("C1",null)), null)), null)))).
orCons(undCons(subcons(tph("_N"),tph("_BA")),undCons(equalcons(tph("_BC"),type("C1",null)), null)),orCons(undCons(subcons(tph("_V"),tph("_BA")),undCons(equalcons(tph("_BC"),type("C2",null)), null)),orCons(undCons(subcons(tph("_V"),tph("_BA")),undCons(equalcons(tph("_BC"),type("C2",null)), null)),null))).
orCons(undCons(equalcons(tph("_BA"),type("C1",null)),undCons(subcons(tph("_N"),tph("_AY")), null)),orCons(undCons(subcons(tph("_V"),tph("_AY")),undCons(equalcons(tph("_BA"),type("C2",null)), null)),orCons(undCons(equalcons(tph("_BA"),type("C1",null)),undCons(subcons(tph("_N"),tph("_AY")), null)),orCons(undCons(subcons(tph("_V"),tph("_AY")),undCons(equalcons(tph("_BA"),type("C2",null)), null)), null)))).
orCons(undCons(equalcons(tph("_AY"),type("C2",null)),undCons(subcons(tph("_V"),tph("_AW")), null)),orCons(undCons(equalcons(tph("_AY"),type("C2",null)),undCons(subcons(tph("_V"),tph("_AW")), null)),orCons(undCons(equalcons(tph("_AY"),type("C1",null)),undCons(subcons(tph("_N"),tph("_AW")), null)),orCons(undCons(equalcons(tph("_AY"),type("C1",null)),undCons(subcons(tph("_N"),tph("_AW")), null)), null)))).
orCons(undCons(equalcons(tph("_AW"),type("C2",null)),undCons(subcons(tph("_V"),tph("_AU")), null)),orCons(undCons(equalcons(tph("_AW"),type("C1",null)),undCons(subcons(tph("_N"),tph("_AU")), null)),orCons(undCons(equalcons(tph("_AW"),type("C2",null)),undCons(subcons(tph("_V"),tph("_AU")), null)),orCons(undCons(equalcons(tph("_AW"),type("C1",null)),undCons(subcons(tph("_N"),tph("_AU")), null)), null)))).
orCons(undCons(subcons(tph("_N"),tph("_AS")),undCons(equalcons(tph("_AU"),type("C1",null)), null)),orCons(undCons(equalcons(tph("_AU"),type("C2",null)),undCons(subcons(tph("_V"),tph("_AS")), null)),orCons(undCons(subcons(tph("_N"),tph("_AS")),undCons(equalcons(tph("_AU"),type("C1",null)), null)),orCons(undCons(equalcons(tph("_AU"),type("C2",null)),undCons(subcons(tph("_V"),tph("_AS")), null)), null)))).
orCons(undCons(subcons(tph("_N"),tph("_AQ")),undCons(equalcons(tph("_AS"),type("C1",null)), null)),orCons(undCons(subcons(tph("_N"),tph("_AQ")),undCons(equalcons(tph("_AS"),type("C1",null)), null)),orCons(undCons(subcons(tph("_V"),tph("_AQ")),undCons(equalcons(tph("_AS"),type("C2",null)), null)),orCons(undCons(subcons(tph("_V"),tph("_AQ")),undCons(equalcons(tph("_AS"),type("C2",null)), null)), null)))).
orCons(undCons(subcons(tph("_V"),tph("_AO")),undCons(equalcons(tph("_AQ"),type("C2",null)), null)),orCons(undCons(subcons(tph("_V"),tph("_AO")),undCons(equalcons(tph("_AQ"),type("C2",null)), null)),orCons(undCons(equalcons(tph("_AQ"),type("C1",null)),undCons(subcons(tph("_N"),tph("_AO")), null)),orCons(undCons(equalcons(tph("_AQ"),type("C1",null)),undCons(subcons(tph("_N"),tph("_AO")), null)), null)))).
orCons(undCons(subcons(tph("_V"),tph("_AM")),undCons(equalcons(tph("_AO"),type("C2",null)), null)),orCons(undCons(equalcons(tph("_AO"),type("C1",null)),undCons(subcons(tph("_N"),tph("_AM")), null)),orCons(undCons(subcons(tph("_V"),tph("_AM")),undCons(equalcons(tph("_AO"),type("C2",null)), null)),orCons(undCons(equalcons(tph("_AO"),type("C1",null)),undCons(subcons(tph("_N"),tph("_AM")), null)), null)))).
orCons(undCons(equalcons(tph("_AM"),type("C1",null)),undCons(subcons(tph("_N"),tph("_AK")), null)),orCons(undCons(equalcons(tph("_AM"),type("C1",null)),undCons(subcons(tph("_N"),tph("_AK")), null)),orCons(undCons(subcons(tph("_V"),tph("_AK")),undCons(equalcons(tph("_AM"),type("C2",null)), null)),orCons(undCons(subcons(tph("_V"),tph("_AK")),undCons(equalcons(tph("_AM"),type("C2",null)), null)), null)))).
orCons(undCons(subcons(tph("_V"),tph("_AI")),undCons(equalcons(tph("_AK"),type("C2",null)), null)),orCons(undCons(equalcons(tph("_AK"),type("C1",null)),undCons(subcons(tph("_N"),tph("_AI")), null)),orCons(undCons(subcons(tph("_V"),tph("_AI")),undCons(equalcons(tph("_AK"),type("C2",null)), null)),orCons(undCons(equalcons(tph("_AK"),type("C1",null)),undCons(subcons(tph("_N"),tph("_AI")), null)), null)))).
orCons(undCons(equalcons(tph("_AI"),type("C2",null)),undCons(subcons(tph("_V"),tph("_AG")), null)),orCons(undCons(equalcons(tph("_AI"),type("C1",null)),undCons(subcons(tph("_N"),tph("_AG")), null)),orCons(undCons(equalcons(tph("_AI"),type("C1",null)),undCons(subcons(tph("_N"),tph("_AG")), null)),orCons(undCons(equalcons(tph("_AI"),type("C2",null)),undCons(subcons(tph("_V"),tph("_AG")), null)), null)))).
subtype(type("java.lang.Boolean",null),type("java.lang.Object",null)):-subtype(type("java.lang.Boolean",null)).subtype(type("java.lang.String",null),type("java.lang.Object",null)):-subtype(type("java.lang.String",null)).subtype(type("java.lang.Integer",null),type("java.lang.Object",null)):-subtype(type("java.lang.Integer",null)).subtype(type("OrConsTest",null),type("java.lang.Object",null)):-subtype(type("OrConsTest",null)).subtype(type("MyPair",params(XX,XY)),type("Pair",params(XX,XX))):-subtype(type("MyPair",params(XX,XY))).subtype(type("Pair",params(XX,XY)),type("Object",null)):-subtype(type("Pair",params(XX,XY))).subtype(type("List",params(XX)),type("Object",null)):-subtype(type("List",params(XX))).subtype(type("Integer",null),type("Object",null)):-subtype(type("Integer",null)).subtype(type("String",null),type("Object",null)):-subtype(type("String",null)).
subtype(type("C1",null),type("java.lang.Object",null)):-subtype(type("C1",null)).
subtype(type("C2",null),type("java.lang.Object",null)):-subtype(type("C2",null)).
subtype(type("java.lang.Boolean",null),type("java.lang.Object",null)):-subtype(type("java.lang.Boolean",null)).subtype(type("java.lang.String",null),type("java.lang.Object",null)):-subtype(type("java.lang.String",null)).subtype(type("java.lang.Integer",null),type("java.lang.Object",null)):-subtype(type("java.lang.Integer",null)).subtype(type("OrConsTest",null),type("java.lang.Object",null)):-subtype(type("OrConsTest",null)).subtype(type("MyPair",params(XX,XY)),type("Pair",params(XX,XX))):-subtype(type("MyPair",params(XX,XY))).subtype(type("Pair",params(XX,XY)),type("Object",null)):-subtype(type("Pair",params(XX,XY))).subtype(type("List",params(XX)),type("Object",null)):-subtype(type("List",params(XX))).subtype(type("Integer",null),type("Object",null)):-subtype(type("Integer",null)).subtype(type("String",null),type("Object",null)):-subtype(type("String",null)).
%TODO: there is propably something wrong with the or-constraint generation
%%%%%
subtype(type("MyPair", params(X, Y)), type("Pair", params(Y, X))) :- subtype(type("MyPair", params(X, Y))).
subtype(type("ArrayList", params(X)), type("List", params(X))) :- subtype(type("ArrayList", params(X))).
subtype(type("List", params(X)), type("Object", null)) :- subtype(type("List", params(X))).
subtype(type("Integer", null), type("Object", null)) :- subtype(type("Integer", null)).
subtype(type("Matrix", null), type("Vector", params(type("Vector", params(type("Integer", null)))))) :- subtype(type("Matrix", null)).
subtype(type("Vector", params(X)), type("Object", null)) :- subtype(type("Vector", params(X))).
% Or-Constraints
undCons(A,B) :- orCons(undCons(A,B), null).
undCons(A,B); orCons(C,D) :- orCons(undCons(A,B), orCons(C,D)).
% undCons
subcons(A,B) :- undCons(subcons(A,B), _).
undCons(C,D) :- undCons(_, undCons(C,D)).
equalcons(A,B) :- undCons(equalcons(A,B), _).
undCons(B,C) :- undCons(A, undCons(B, C)).
% Subtyping
subtype(A, A) :- subtype(A). % reflexive
subtype(A, A) :- subtype(A, B). % reflexive
subtype(B) :- subtype(A, B). % transitive
subtype(A, C) :- subtype(A, B), subtype(B, C). % transitive
% named Subtyping
namedSubtype(A,B) :- subtype(type(A, AP), type(B, BP)).
% is reflexive and transitive because subtype it stems from subtype
% generate the subtype relations for every constraint where one is needed: (this could be optimized)
subtype(type(A, P)) :- subcons(_, type(A, P)).
subtype(type(A, P)) :- subcons(type(A, P), _).
% subst:
subst(tph(A), type(N,P)) :- equalcons(tph(A), type(N, P)).
% subst-L:
subcons(B,C) :- subst(A, B), subcons(A, C).
%subst-R:
subcons(C,B) :- subst(A, B), subcons(C, A).
%subst-Equal:
equalcons(B,C) :- subst(A, B), equalcons(A, C).
%swap:
equalcons(A,B) :- equalcons(B,A).
%unfold:
equalcons(T, T) :- equalcons(tph(_), type(_, params(T))).
equalcons(T, T) :- equalcons(tph(_), type(_, params(T, _))).
equalcons(T, T) :- equalcons(tph(_), type(_, params(_, T))).
equalcons(T, T) :- equalcons(tph(_), type(_, params(T, _, _))).
equalcons(T, T) :- equalcons(tph(_), type(_, params(_, T, _))).
equalcons(T, T) :- equalcons(tph(_), type(_, params(_, _, T))).
% Subst-Param:
subcons(A, type(C, params(T2))) :- subcons(A, type(C, params(T))), subst(T, T2).
subcons(A, type(C, params(T2, P2))) :- subcons(A, type(C, params(T, P2))), subst(T, T2).
subcons(A, type(C, params(P1, T2))) :- subcons(A, type(C, params(P1, T))), subst(T, T2).
subcons(A, type(C, params(T2, P2, P3))) :- subcons(A, type(C, params(T, P2, P3))), subst(T, T2).
subcons(A, type(C, params(P1, T2, P3))) :- subcons(A, type(C, params(P1, T, P3))), subst(T, T2).
subcons(A, type(C, params( P1, P2, T2))) :- subcons(A, type(C, params(P1, P2, T))), subst(T, T2).
% match
subcons(type(C, P1), type(D, P2)) :- subcons(tph(A), type(C, P1)), subcons(tph(A), type(D, P2)), namedSubtype(C, D).
% adopt
subcons(tph(A), type(C,P)) :- subcons(tph(A), tph(B)), subcons(tph(B), type(C,P)).
% adapt
equalcons(type(D,P3), type(D,P2)) :- subcons(type(C,P), type(D, P2)), subtype(type(C, P), type(D, P3)).
% reduce
equalcons(P1, PP1) :- equalcons(type(C, params(P1)), type(C, params(PP1))).
equalcons(P1, PP1) :- equalcons(type(C, params(P1, P2)), type(C, params(PP1, PP2))).
equalcons(P2, PP2) :- equalcons(type(C, params(P1, P2)), type(C, params(PP1, PP2))).
equalcons(P1, PP1) :- equalcons(type(C, params(P1, P2, P3)), type(C, params(PP1, PP2, PP3))).
equalcons(P2, PP2) :- equalcons(type(C, params(P1, P2, P3)), type(C, params(PP1, PP2, PP3))).
equalcons(P3, PP3) :- equalcons(type(C, params(P1, P2, P3)), type(C, params(PP1, PP2, PP3))).
% super
{ equalcons(tph(A), type(D, DP)): subtype(type(C, CP), type(D, DP)) } == 1 :- subcons(type(C, CP), tph(A)).
%equalcons(tph(A), type(C, CP)) :- subcons(type(C, CP), tph(A)), not subtype(type(C, CP),_).
%Solution-Gen
%subst(tph(A), typeVar(tph(A))) :- subcons(tph(A), type(C,P)), not sigma(tph(A), _).
%sigma2(tph(A), typeVar(tph(A))) :- subcons(tph(A), type(C,P)), not sigma(tph(A), _).
% here we check if there is a constraint a <. C, where there is no other Constraint. This is the solution-Gen rule
%Solution-Subst:
hasASubtype(tph(A), type(D,P2)) :- subcons(tph(A), type(C,P)), subcons(tph(A), type(D,P2)), namedSubtype(C, D), C != D.
equalcons(tph(A), type(C,P)) :- subcons(tph(A), type(C,P)), not hasASubtype(tph(A), type(C,P)).
%Solution:
tphs( P ) :- equalcons(tph(A), type(C, P)).
sigma(tph(A), type(C,P)) :- equalcons(tph(A), type(C, P)), not tphs(_, P).
% Fail
:- equalcons(tph(A), type(C, P)), tphs(tph(A), P). % fail for subst
:- equalcons(type(C, CP), type(D, DP)), C != D. % fail for reduce
:- subcons(type(C, CP), type(D, DP)), not namedSubtype(C, D). % fail for adapt
:- subcons(tph(A), type(D, DP)), subcons(tph(A), type(C, CP)), not namedSubtype(C, D), not namedSubtype(D, C). %Fail for match
%% Helpers
%tphs:
tphs(tph(P), params(tph(P))) :- tphs( params(tph(P))).
tphs(P) :- tphs( params(type(C, P))).
tphs(tph(A), params(type(C, P))) :- tphs( params(type(C, P))), tphs(tph(A), P).
tphs(tph(P), params(X, tph(P))) :- tphs( params(X, tph(P))).
tphs(tph(P), params(tph(P), X)) :- tphs( params(tph(P), X)).
tphs(P) :- tphs( params(X, type(C, P))).
tphs(P) :- tphs( params(type(C, P), X)).
tphs(tph(A), params(X, type(C, P))) :- tphs( params(X, type(C, P))), tphs(tph(A), P).
tphs(tph(A), params(type(C, P), X)) :- tphs( params(type(C, P), X)), tphs(tph(A), P).
tphs(tph(P), params(tph(P), X, Y)) :- tphs( params(tph(P), X, Y)).
tphs(tph(P), params(X, tph(P), Y)) :- tphs( params(X, tph(P), Y)).
tphs(tph(P), params(X,Y,tph(P))) :- tphs( params(X, Y, tph(P))).
tphs(P) :- tphs( params(type(C, P), X, Y)).
tphs(P) :- tphs( params(X, type(C, P),Y)).
tphs(P) :- tphs( params(X,Y,type(C, P))).
tphs(tph(A), params(type(C, P), X, Y)) :- tphs( params(type(C, P), X, Y)), tphs(tph(A), P).
tphs(tph(A), params(X, type(C, P), Y)) :- tphs( params(X, type(C, P), Y)), tphs(tph(A), P).
tphs(tph(A), params(X, Y, type(C, P))) :- tphs( params(X, Y, type(C, P))), tphs(tph(A), P).
#show sigma/2.
#show sigma2/2.
-234
View File
@@ -1,234 +0,0 @@
package de.dhbwstuttgart;
import de.dhbwstuttgart.input.ConstraintParser;
import de.dhbwstuttgart.output.SolutionParser;
import de.dhbwstuttgart.sat.asp.ASPGenerator;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import de.dhbwstuttgart.sat.asp.Pair;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Small CLI over this project's two translation entry points, so a shell pipeline can call into
* it without embedding a JVM: turning a {@code .cons} constraint file into ASP facts for clingo,
* and turning clingo's answer-set text back into a placeholder-name-to-type JSON map.
*/
public class Main {
public static void main(String[] args) {
if (args.length < 1) {
printUsage();
System.exit(1);
}
try {
switch (args[0]) {
case "gen-facts" -> {
if (args.length != 3) {
System.err.println("gen-facts requires exactly 2 arguments: <constraints.cons> <out-facts.lp>");
System.exit(1);
}
genFacts(args[1], args[2]);
}
case "cycle-check-facts" -> {
if (args.length != 3) {
System.err.println("cycle-check-facts requires exactly 2 arguments: <constraints.cons> <out-facts.lp>");
System.exit(1);
}
cycleCheckFacts(args[1], args[2]);
}
case "gen-facts-pruned" -> {
if (args.length != 4) {
System.err.println("gen-facts-pruned requires exactly 3 arguments: "
+ "<constraints.cons> <brave-atoms.txt> <out-facts.lp>");
System.exit(1);
}
genFactsPruned(args[1], args[2], args[3]);
}
case "parse-solution" -> {
if (args.length != 3) {
System.err.println("parse-solution requires exactly 2 arguments: <clingo-atoms.txt> <out-solution.json>");
System.exit(1);
}
parseSolution(args[1], args[2]);
}
default -> {
System.err.println("Unknown subcommand: " + args[0]);
printUsage();
System.exit(1);
}
}
} catch (IOException e) {
System.err.println("I/O error: " + e.getMessage());
System.exit(1);
}
}
private static void genFacts(String consFile, String outFactsFile) throws IOException {
String cons = Files.readString(Path.of(consFile));
// Both ANTLR grammars require at least one entry ("(x)+"), so a blank/empty input -
// e.g. a Java file with no constraint-generating constructs yet supported by
// JavaConstraintGenerator - would otherwise crash instead of producing an empty result.
if (cons.isBlank()) {
Files.writeString(Path.of(outFactsFile), "");
return;
}
var orCons = ConstraintParser.parse(cons);
String asp = ASPGenerator.generateASP(orCons);
// extendsRelation entries (e.g. "Matrix < java.util.Vector", from JavaConstraintGenerator
// gathering the analysed classes' own extends/implements clauses) are a separate grammar
// production parsed separately from the constraints/or-constraints ConstraintParser.parse
// already handled above - both read the same .cons text, just looking at different parts
// of its parse tree.
var extendsRelations = ConstraintParser.parseExtendsRelations(cons);
String extendsAsp = ASPGenerator.generateExtendsRelations(extendsRelations);
Files.writeString(Path.of(outFactsFile), asp + extendsAsp);
}
/**
* Writes the facts {@code cycleCheck.lp} consumes - see that file's header. Run before the
* real solve to find or-constraint alternatives that force a placeholder to equal a type
* containing itself; those can never be part of a solution and make clingo's grounder
* diverge if left in (see ../../ASP_BUGS.md, Bug 5).
*/
private static void cycleCheckFacts(String consFile, String outFactsFile) throws IOException {
String cons = Files.readString(Path.of(consFile));
if (cons.isBlank()) {
Files.writeString(Path.of(outFactsFile), "");
return;
}
Files.writeString(Path.of(outFactsFile),
ASPGenerator.generateCycleCheckFacts(ConstraintParser.parse(cons)));
}
/**
* Like {@code gen-facts}, but keeps only the or-constraint alternatives named in
* {@code braveAtomsFile} - clingo's brave consequences from the {@code cycleCheck.lp} run,
* i.e. every alternative that occurs in at least one acyclic selection. An alternative
* outside that set belongs to no solution.
*
* <p>An or-constraint that loses every alternative would be unsatisfiable, but that cannot
* happen here: were it so, the cycle check itself would have been UNSATISFIABLE and the
* caller would have stopped before reaching this point.
*/
private static void genFactsPruned(String consFile, String braveAtomsFile, String outFactsFile)
throws IOException {
String cons = Files.readString(Path.of(consFile));
if (cons.isBlank()) {
Files.writeString(Path.of(outFactsFile), "");
return;
}
Set<String> keep = parseChosenAtoms(Files.readString(Path.of(braveAtomsFile)));
var orCons = ConstraintParser.parse(cons);
var pruned = new ArrayList<List<Set<Pair>>>(orCons.size());
for (int o = 0; o < orCons.size(); o++) {
var alternatives = orCons.get(o);
var surviving = new ArrayList<Set<Pair>>(alternatives.size());
for (int a = 0; a < alternatives.size(); a++) {
if (keep.contains(o + "," + a)) surviving.add(alternatives.get(a));
}
// Defensive: an empty list would render as a malformed orCons(...) term. If the
// brave-consequence file was empty or unreadable, fall back to the full set rather
// than emit something the grammar cannot express.
pruned.add(surviving.isEmpty() ? alternatives : surviving);
}
String asp = ASPGenerator.generateASP(pruned);
var extendsRelations = ConstraintParser.parseExtendsRelations(cons);
Files.writeString(Path.of(outFactsFile), asp + ASPGenerator.generateExtendsRelations(extendsRelations));
}
/** Extracts "O,A" keys from clingo's {@code chosen(O,A)} brave-consequence atoms. */
private static Set<String> parseChosenAtoms(String atoms) {
Set<String> keys = new LinkedHashSet<>();
Matcher m = Pattern.compile("chosen\\((\\d+),(\\d+)\\)").matcher(atoms);
while (m.find()) keys.add(m.group(1) + "," + m.group(2));
return keys;
}
private static void parseSolution(String atomsFile, String outSolutionFile) throws IOException {
String atoms = Files.readString(Path.of(atomsFile));
if (atoms.isBlank()) {
Files.writeString(Path.of(outSolutionFile), "{\n}\n");
return;
}
Map<String, String> solution = SolutionParser.parse(atoms);
Files.writeString(Path.of(outSolutionFile), toJson(solution));
}
/**
* {@link SolutionParser#parse} strips the leading underscore off every placeholder name
* (its grammar folds it into the literal that precedes the identifier token), but every
* other artifact in this pipeline - the {@code .cons} format, the type-placeholder-position
* JSON from JavaConstraintGenerator - uses the full name including the leading underscore
* (e.g. {@code "_Foo_3"}). Restore it here so downstream consumers can match placeholder
* names directly with no reformatting of their own.
*/
private static String toJson(Map<String, String> solution) {
StringBuilder sb = new StringBuilder();
sb.append("{\n");
int i = 0;
for (var entry : solution.entrySet()) {
sb.append(" ").append(quote("_" + entry.getKey())).append(": ").append(quote(entry.getValue()));
if (++i < solution.size()) sb.append(',');
sb.append('\n');
}
sb.append("}\n");
return sb.toString();
}
private static String quote(String s) {
StringBuilder sb = new StringBuilder(s.length() + 2);
sb.append('"');
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch (c) {
case '"' -> sb.append("\\\"");
case '\\' -> sb.append("\\\\");
case '\n' -> sb.append("\\n");
case '\r' -> sb.append("\\r");
case '\t' -> sb.append("\\t");
default -> {
if (c < 0x20) {
sb.append(String.format("\\u%04x", (int) c));
} else {
sb.append(c);
}
}
}
}
sb.append('"');
return sb.toString();
}
private static void printUsage() {
System.err.println("Usage: Main <subcommand> [args]");
System.err.println();
System.err.println(" gen-facts <constraints.cons> <out-facts.lp>");
System.err.println(" Parse a .cons constraint file and write the equivalent ASP");
System.err.println(" facts, ready to run through clingo together with unifyDiss.lp.");
System.err.println();
System.err.println(" cycle-check-facts <constraints.cons> <out-facts.lp>");
System.err.println(" Write the facts for cycleCheck.lp. Run that first, with");
System.err.println(" --enum-mode=brave: UNSATISFIABLE means the constraint set has no");
System.err.println(" finite solution; otherwise its chosen(O,A) atoms say which");
System.err.println(" or-constraint alternatives are still worth solving.");
System.err.println();
System.err.println(" gen-facts-pruned <constraints.cons> <brave-atoms.txt> <out-facts.lp>");
System.err.println(" Like gen-facts, but drops every or-constraint alternative absent");
System.err.println(" from the cycle check's brave consequences.");
System.err.println();
System.err.println(" parse-solution <clingo-atoms.txt> <out-solution.json>");
System.err.println(" Parse clingo's answer-set atoms (only sigma(tph(...), type(...))");
System.err.println(" atoms - filter clingo's output with show.lp first) and write a");
System.err.println(" flat JSON object mapping each placeholder name to its solved type.");
}
}
@@ -0,0 +1,7 @@
package de.dhbwstuttgart.exceptions;
public class DebugException extends RuntimeException{
public DebugException(String message){
System.err.println(message);
}
}
@@ -1,87 +0,0 @@
package de.dhbwstuttgart.input;
import de.dhbwstuttgart.input.parser.ConstraintSetLexer;
import de.dhbwstuttgart.input.parser.ConstraintSetParser;
import de.dhbwstuttgart.sat.asp.*;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class ConstraintParser {
public static NamedType replaceGenerics(NamedType in, Set<String> genericNames){
List<Type> superParams = in.params().stream().map(p -> {
if(genericNames.contains(p.name())){
return (Type) new TypeParameter(p.name());
}else{
return replaceGenerics((NamedType) p, genericNames);
}
}).toList();
return new NamedType(in.name(), superParams);
}
public static List<ExtendsRelation> parseExtendsRelations(String cons){
CharStream input = CharStreams.fromString(cons);
de.dhbwstuttgart.input.parser.ConstraintSetLexer lexer = new ConstraintSetLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
ConstraintSetParser parser = new ConstraintSetParser(tokens);
ConstraintSetParser.ConstraintSetContext conSet = parser.constraintSet(); //Parsen
List<ExtendsRelation> ret = new ArrayList<>();
for(var ext : conSet.extendsRelation()){
if(ext.typeParams()!=null){
var typeParams = ext.typeParams().IDENTIFIER().stream().map(x -> new TypeParameter(x.getText())).toList();
var typeParamNames = typeParams.stream().map(tp -> tp.name()).collect(Collectors.toSet());
NamedType parsedSuperType = (NamedType) parseType(ext.type());
parsedSuperType = replaceGenerics(parsedSuperType, typeParamNames);
ret.add(new ExtendsRelation(ext.IDENTIFIER().getText(), typeParams, parsedSuperType));
}else{
ret.add(new ExtendsRelation(ext.IDENTIFIER().getText(), List.of(), (NamedType) parseType(ext.type())));
}
}
return ret;
}
public static List<List<Set<Pair>>> parse(String cons){
CharStream input = CharStreams.fromString(cons);
de.dhbwstuttgart.input.parser.ConstraintSetLexer lexer = new ConstraintSetLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
ConstraintSetParser parser = new ConstraintSetParser(tokens);
ConstraintSetParser.ConstraintSetContext conSet = parser.constraintSet(); //Parsen
Set<Pair> undCons = conSet.constraints().stream().flatMap(c -> parseUndConstraint(c).stream()).collect(Collectors.toSet());
var ret = new ArrayList<List<Set<Pair>>>();
var orCons = conSet.orConstraint().stream().map(ConstraintParser::parseOrConstraint).toList();
if(undCons.size() > 0)ret.add(List.of(undCons));
ret.addAll(orCons);
return ret;
}
private static List<Set<Pair>> parseOrConstraint(ConstraintSetParser.OrConstraintContext ctx) {
return ctx.constraints().stream().map(ConstraintParser::parseUndConstraint).toList();
}
private static Set<Pair> parseUndConstraint(ConstraintSetParser.ConstraintsContext ctx){
return ctx.constraint().stream().map(ConstraintParser::parseConstraint).collect(Collectors.toSet());
}
private static Pair parseConstraint(ConstraintSetParser.ConstraintContext ctx){
if(ctx.equalsCons() != null){
return new EqualsDot(parseType(ctx.equalsCons().type().get(0)),
parseType(ctx.equalsCons().type().get(1)));
}else{
return new LessDot(parseType(ctx.subtypeCons().type().get(0)),
parseType(ctx.subtypeCons().type().get(1)));
}
}
private static Type parseType(ConstraintSetParser.TypeContext ctx) {
if(ctx.tph()!=null){
return new TypePlaceholder(ctx.tph().getText());
}else{
if(ctx.namedType().params() != null)
return new NamedType(ctx.namedType().IDENTIFIER().getText(), ctx.namedType().params().type().stream().map(ConstraintParser::parseType).toList());
else
return new NamedType(ctx.namedType().IDENTIFIER().getText(), List.of());
}
}
}
@@ -1,37 +0,0 @@
package de.dhbwstuttgart.output;
import de.dhbwstuttgart.input.ConstraintParser;
import de.dhbwstuttgart.sat.asp.Pair;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import java.util.*;
import java.util.stream.Collectors;
record Sigma(String tphName, String typeReplacement){}
public class SolutionParser {
public static Map<String, String> parse(String cons){
CharStream input = CharStreams.fromString(cons);
de.dhbwstuttgart.input.parser.SolutionLexer lexer = new de.dhbwstuttgart.input.parser.SolutionLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
de.dhbwstuttgart.input.parser.SolutionParser parser = new de.dhbwstuttgart.input.parser.SolutionParser(tokens);
de.dhbwstuttgart.input.parser.SolutionParser.SolutionsetContext conSet = parser.solutionset(); //Parsen
Set<Sigma> solutions = conSet.solution().stream().map(solutionContext -> new Sigma(solutionContext.tph().IDENTIFIER().getText(), parseType(solutionContext.type()))).collect(Collectors.toSet());
Map<String, String> ret = new HashMap<>();
for(Sigma solution : solutions){
ret.put(solution.tphName(), solution.typeReplacement());
}
return ret;
}
private static String parseType(de.dhbwstuttgart.input.parser.SolutionParser.TypeContext type) {
String params = "";
if(type.params().type().size() > 0){
params += "<";
params += type.params().type().stream().map(t -> parseType(t)).collect(Collectors.joining(","));
params += ">";
}
return type.IDENTIFIER().getText() + params;
}
}
@@ -1,148 +0,0 @@
package de.dhbwstuttgart.sat.asp;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class ASPGenerator {
public static String generateASP(List<List<Set<Pair>>> orCons){
StringBuilder ret = new StringBuilder();
for(List<Set<Pair>> orCon : orCons){
ret.append(generateOrCons(orCon) + ".\n");
}
return ret.toString();
}
public static String generateASP(List<List<Set<Pair>>> orCons, int numCons){
StringBuilder ret = new StringBuilder();
for(List<Set<Pair>> orCon : orCons){
var smallerOrCon = orCon.stream().limit(numCons).collect(Collectors.toList());
ret.append(generateOrCons(smallerOrCon) + ".\n");
}
return ret.toString();
}
public static String generateOrCons(List<Set<Pair>> undCon){
if(undCon.size() < 2){
return "orCons(" + generateUndCons(undCon.getFirst()) + ", null)";
}else {
Set<Pair> first = undCon.getFirst();
undCon = undCon.subList(1, undCon.size());
return "orCons(" + generateUndCons(first) + ","+ generateOrCons(undCon) + ")";
}/*
String ret = "orCons(";
for(Set<Pair> uCon : undCons){
String aspUndConstraint = generateUndCons(uCon);
ret += aspUndConstraint + ",";
}
ret = ret.substring(0, ret.length()-1);
return ret + ")";*/
}
public static String generateUndCons(Set<Pair> undCon){
if(undCon.size() == 1){
return "undCons(" + undCon.iterator().next().toASP() + ", null)";
}else {
// undCOns verschachteln
Pair first = undCon.iterator().next();
undCon = undCon.stream().filter(x->!first.equals(x)).collect(Collectors.toSet());
return "undCons(" + first.toASP() + ","+ generateUndCons(undCon) + ")";
}
}
/**
* Emits the facts {@code cycleCheck.lp} consumes: one {@code alt/2} per or-constraint
* alternative, plus the placeholder-level edges that alternative contributes.
*
* <p>Two edge kinds, and the distinction is the whole point of the check:
* <ul>
* <li>{@code containsEdge(O,A,P,Q)} - solving P means solving Q <em>inside</em> P's own
* type, as in {@code _r <. C1<_p1>}. Only these can make a type contain itself.</li>
* <li>{@code flowEdge(O,A,P,Q)} - P's type flows into Q's, as in {@code _p <. _res}.
* A cycle of these alone is harmless: it means the two are the same type.</li>
* </ul>
*
* <p>Deliberately conservative. An edge is emitted only where the constraint genuinely
* forces containment, so {@code C<_q> <. _p} contributes nothing - being a supertype of
* {@code C<_q>} does not oblige {@code _p} to contain {@code _q}. Missing an edge only
* costs detection (the encoding's own Fail-Cycle remains as a backstop); inventing one
* would reject a satisfiable constraint set.
*
* <p>Constraints outside any or-constraint arrive here as an or-constraint with a single
* alternative, so they need no special handling - their edges are simply always chosen.
*/
public static String generateCycleCheckFacts(List<List<Set<Pair>>> orCons) {
StringBuilder ret = new StringBuilder();
for (int o = 0; o < orCons.size(); o++) {
List<Set<Pair>> alternatives = orCons.get(o);
for (int a = 0; a < alternatives.size(); a++) {
ret.append("alt(").append(o).append(',').append(a).append(").\n");
for (Pair pair : alternatives.get(a)) {
appendEdges(ret, o, a, pair);
}
}
}
return ret.toString();
}
private static void appendEdges(StringBuilder ret, int o, int a, Pair pair) {
Type left;
Type right;
boolean symmetric;
if (pair instanceof LessDot ld) {
left = ld.left();
right = ld.right();
symmetric = false;
} else if (pair instanceof EqualsDot ed) {
left = ed.left();
right = ed.right();
symmetric = true;
} else {
return;
}
if (left instanceof TypePlaceholder p && right instanceof TypePlaceholder q) {
edge(ret, "flowEdge", o, a, p.name(), q.name());
if (symmetric) edge(ret, "flowEdge", o, a, q.name(), p.name());
return;
}
// P <. C<..Q..> / P =. C<..Q..> : P's type has to contain Q's.
if (left instanceof TypePlaceholder p && right instanceof NamedType n) {
for (String q : placeholdersIn(n)) edge(ret, "containsEdge", o, a, p.name(), q);
}
// C<..Q..> =. P : same obligation, equality being symmetric. The <. form is NOT included.
if (symmetric && left instanceof NamedType n && right instanceof TypePlaceholder p) {
for (String q : placeholdersIn(n)) edge(ret, "containsEdge", o, a, p.name(), q);
}
}
private static void edge(StringBuilder ret, String pred, int o, int a, String from, String to) {
ret.append(pred).append('(').append(o).append(',').append(a)
.append(",\"").append(from).append("\",\"").append(to).append("\").\n");
}
/** Every type-placeholder name occurring anywhere inside {@code type}, at any depth. */
private static Set<String> placeholdersIn(Type type) {
Set<String> found = new java.util.LinkedHashSet<>();
collectPlaceholders(type, found);
return found;
}
private static void collectPlaceholders(Type type, Set<String> found) {
if (type instanceof TypePlaceholder p) {
found.add(p.name());
} else if (type instanceof NamedType n) {
for (Type param : n.params()) collectPlaceholders(param, found);
}
}
public static String generateExtendsRelations(List<ExtendsRelation> extendsRelations) {
String ret = "";
for(var x : extendsRelations){
NamedType subtype = new NamedType(x.subtypeName(), x.subtypeParams().stream().map(i -> (Type)i).toList());
ret += "subtype("+subtype.toASP()+","+x.superType().toASP()+"):-subtype("+subtype.toASP()+").";
}
return ret;
}
}
@@ -1,8 +0,0 @@
package de.dhbwstuttgart.sat.asp;
public record EqualsDot(Type left, Type right) implements Pair {
@Override
public String toASP() {
return "equalcons("+ left().toASP() + "," + right().toASP() + ")";
}
}
@@ -1,6 +0,0 @@
package de.dhbwstuttgart.sat.asp;
import java.util.List;
public record ExtendsRelation(String subtypeName, List<TypeParameter> subtypeParams, NamedType superType) {
}
@@ -1,8 +0,0 @@
package de.dhbwstuttgart.sat.asp;
public record LessDot(Type left, Type right) implements Pair {
@Override
public String toASP() {
return "subcons("+ left().toASP() + "," + right().toASP() + ")";
}
}
@@ -1,12 +0,0 @@
package de.dhbwstuttgart.sat.asp;
import java.util.List;
import java.util.stream.Collectors;
public record NamedType(String name, List<Type> params) implements Type {
@Override
public String toASP() {
if(params.size() > 0)return "type(\""+name+"\",params(" + params.stream().map(Type::toASP).collect(Collectors.joining(",")) + "))";
return "type(\""+name+"\",null)";
}
}
@@ -1,5 +0,0 @@
package de.dhbwstuttgart.sat.asp;
public interface Pair {
String toASP();
}
@@ -1,6 +0,0 @@
package de.dhbwstuttgart.sat.asp;
public interface Type {
String name();
String toASP();
}
@@ -1,8 +0,0 @@
package de.dhbwstuttgart.sat.asp;
public record TypeParameter(String name) implements Type{
@Override
public String toASP() {
return "X"+name;
}
}
@@ -1,8 +0,0 @@
package de.dhbwstuttgart.sat.asp;
public record TypePlaceholder(String name) implements Type {
@Override
public String toASP() {
return "tph(\""+name+"\")";
}
}
@@ -0,0 +1,69 @@
package de.dhbwstuttgart.typeinference.constraints;
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
public class Constraint<A> extends HashSet<A> {
private static final long serialVersionUID = 1L;
private Boolean isInherited = false;//wird nur für die Method-Constraints benoetigt
/*
* wird verwendet um bei der Codegenerierung die richtige Methoden - Signatur
* auszuwaehlen
*/
/*private*/ Set<A> methodSignatureConstraint = new HashSet<>();
private Constraint<A> extendConstraint = null;
public Constraint() {
super();
}
public Constraint(Boolean isInherited) {
this.isInherited = isInherited;
}
public Constraint(Boolean isInherited, Constraint<A> extendConstraint, Set<A> methodSignatureConstraint) {
this.isInherited = isInherited;
this.extendConstraint = extendConstraint;
this.methodSignatureConstraint = methodSignatureConstraint;
}
public void setIsInherited(Boolean isInherited) {
this.isInherited = isInherited;
}
public Boolean isInherited() {
return isInherited;
}
public Constraint<A> getExtendConstraint() {
return extendConstraint;
}
public void setExtendConstraint(Constraint<A> c) {
extendConstraint = c;
}
public Set<A> getmethodSignatureConstraint() {
return methodSignatureConstraint;
}
public void setmethodSignatureConstraint(Set<A> c) {
methodSignatureConstraint = c;
}
public String toString() {
return super.toString() + "\nisInherited = " + isInherited
//" + extendsContraint: " + (extendConstraint != null ? extendConstraint.toStringBase() : "null" )
+ "\n" ;
}
public String toStringBase() {
return super.toString();
}
}
@@ -0,0 +1,126 @@
package de.dhbwstuttgart.typeinference.constraints;
import de.dhbwstuttgart.typeinference.unify.GuavaSetOperations;
import java.util.*;
import java.util.function.BinaryOperator;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
public class ConstraintSet<A> {
Constraint<A> undConstraints = new Constraint<>();
List<Set<Constraint<A>>> oderConstraints = new ArrayList<>();
public void addUndConstraint(A p){
undConstraints.add(p);
}
public void addOderConstraint(Set<Constraint<A>> methodConstraints) {
oderConstraints.add(methodConstraints);
}
public void addAllUndConstraint(Constraint<A> allUndConstraints){
undConstraints.addAll(allUndConstraints);
}
public void addAllOderConstraint(List<Set<Constraint<A>>> allOderConstraints){
this.oderConstraints.addAll(allOderConstraints);
}
public void addAll(ConstraintSet constraints) {
this.addAllUndConstraint(constraints.undConstraints);
this.addAllOderConstraint(constraints.oderConstraints);
}
@Override
public String toString(){
BinaryOperator<String> b = (x,y) -> x+y;
return "\nUND:" + this.undConstraints.toString() + "\n" +
"ODER:" + this.oderConstraints.stream().reduce("", (x,y) -> x.toString()+ "\n" +y, b);
//cartesianProduct().toString();
}
public Set<List<Constraint<A>>> cartesianProduct(){
Set<Constraint<A>> toAdd = new HashSet<>();
toAdd.add(undConstraints);
List<Set<Constraint<A>>> allConstraints = new ArrayList<>();
allConstraints.add(toAdd);
allConstraints.addAll(oderConstraints);
return new GuavaSetOperations().cartesianProduct(allConstraints);
}
public <B> ConstraintSet<B> map(Function<? super A, ? extends B> o) {
Hashtable<Constraint<A>,Constraint<B>> CSA2CSB = new Hashtable<>();
ConstraintSet<B> ret = new ConstraintSet<>();
ret.undConstraints = undConstraints.stream().map(o).collect(Collectors.toCollection(Constraint<B>::new));
List<Set<Constraint<B>>> newOder = new ArrayList<>();
/*
for(Set<Constraint<A>> oderConstraint : oderConstraints){
oderConstraint.forEach(as -> {
Constraint<B> newConst = as.stream()
.map(o)
.collect(Collectors.toCollection(
() -> new Constraint<B> (as.isInherited())));
CSA2CSB.put(as, newConst);} );
}
*/
for(Set<Constraint<A>> oderConstraint : oderConstraints){
newOder.add(
oderConstraint.parallelStream().map((Constraint<A> as) -> {
Constraint<B> newConst = as.stream()
.map(o)
.collect(Collectors.toCollection((as.getExtendConstraint() != null)
? () -> new Constraint<B> (as.isInherited(),
as.getExtendConstraint().stream().map(o).collect(Collectors.toCollection(Constraint::new)),
as.getmethodSignatureConstraint().stream().map(o).collect(Collectors.toCollection(HashSet::new)))
: () -> new Constraint<B> (as.isInherited())
));
//CSA2CSB.put(as, newConst);
return newConst;
/*
Constraint<B> bs = CSA2CSB.get(as);
if (as.getExtendConstraint() != null) {
bs.setExtendConstraint(CSA2CSB.get(as.getExtendConstraint()));
}
return bs;
*/
}).collect(Collectors.toSet())
);
}
ret.oderConstraints = newOder;
return ret;
}
public void forEach (Consumer<? super A> c) {
undConstraints.stream().forEach(c);
for(Set<Constraint<A>> oderConstraint : oderConstraints){
oderConstraint.parallelStream().forEach((Constraint<A> as) ->
as.stream().forEach(c));
}
}
public Set<A> getAll () {
Set<A> ret = new HashSet<>();
ret.addAll(undConstraints);
for(Set<Constraint<A>> oderConstraint : oderConstraints){
oderConstraint.parallelStream().forEach((Constraint<A> as) -> ret.addAll(as));
}
return ret;
}
public List<Set<Constraint<A>>> getOderConstraints() {
return oderConstraints;
}
public Set<A> getUndConstraints() {
return undConstraints;
}
}
@@ -0,0 +1,13 @@
package de.dhbwstuttgart.typeinference.constraints;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import de.dhbwstuttgart.typeinference.unify.model.PairOperator;
public class Pair implements Serializable
{
}
// ino.end
@@ -0,0 +1,23 @@
package de.dhbwstuttgart.typeinference.unify;
import java.util.List;
import java.util.Set;
import com.google.common.collect.Sets;
import de.dhbwstuttgart.typeinference.unify.interfaces.ISetOperations;
/**
* Implements set operations using google guava.
* @author DH10STF
*
*/
public class GuavaSetOperations implements ISetOperations {
@Override
public <B> Set<List<B>> cartesianProduct(List<? extends Set<? extends B>> sets) {
// Wraps the call to google guava
return Sets.cartesianProduct(sets);
}
}
@@ -0,0 +1,108 @@
package de.dhbwstuttgart.typeinference.unify;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import de.dhbwstuttgart.typeinference.unify.interfaces.IUnify;
import de.dhbwstuttgart.typeinference.unify.model.PairOperator;
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
import de.dhbwstuttgart.typeinference.unify.model.TypeParams;
import de.dhbwstuttgart.typeinference.unify.model.Unifier;
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
import de.dhbwstuttgart.typeinference.unify.model.UnifyType;
/**
* Implementation of the Martelli-Montanari unification algorithm.
* @author Florian Steurer
*/
public class MartelliMontanariUnify implements IUnify {
@Override
public Optional<Unifier> unify(Set<UnifyType> terms) {
// Sets with less than 2 terms are trivially unified
if(terms.size() < 2)
return Optional.of(Unifier.identity());
// For the the set of terms {t1,...,tn},
// build a list of equations {(t1 = t2), (t2 = t3), (t3 = t4), ....}
ArrayList<UnifyPair> termsList = new ArrayList<UnifyPair>();
Iterator<UnifyType> iter = terms.iterator();
UnifyType prev = iter.next();
while(iter.hasNext()) {
UnifyType next = iter.next();
termsList.add(new UnifyPair(prev, next, PairOperator.EQUALSDOT));
prev = next;
}
// Start with the identity unifier. Substitutions will be added later.
Unifier mgu = Unifier.identity();
// Apply rules while possible
int idx = 0;
while(idx < termsList.size()) {
UnifyPair pair = termsList.get(idx);
UnifyType rhsType = pair.getRhsType();
UnifyType lhsType = pair.getLhsType();
TypeParams rhsTypeParams = rhsType.getTypeParams();
TypeParams lhsTypeParams = lhsType.getTypeParams();
// REDUCE - Rule
if(!(rhsType instanceof PlaceholderType) && !(lhsType instanceof PlaceholderType)) {
Set<UnifyPair> result = new HashSet<>();
// f<...> = g<...> with f != g are not unifiable
if(!rhsType.getName().equals(lhsType.getName()))
return Optional.empty(); // conflict
// f<t1,...,tn> = f<s1,...,sm> are not unifiable
if(rhsTypeParams.size() != lhsTypeParams.size())
return Optional.empty(); // conflict
// f = g is not unifiable (cannot be f = f because erase rule would have been applied)
//if(rhsTypeParams.size() == 0)
//return Optional.empty();
// Unpack the arguments
for(int i = 0; i < rhsTypeParams.size(); i++)
result.add(new UnifyPair(rhsTypeParams.get(i), lhsTypeParams.get(i), PairOperator.EQUALSDOT));
termsList.remove(idx);
termsList.addAll(result);
continue;
}
// DELETE - Rule
if(pair.getRhsType().equals(pair.getLhsType())) {
termsList.remove(idx);
continue;
}
// SWAP - Rule
if(!(lhsType instanceof PlaceholderType) && (rhsType instanceof PlaceholderType)) {
termsList.remove(idx);
termsList.add(new UnifyPair(rhsType, lhsType, PairOperator.EQUALSDOT));
continue;
}
// OCCURS-CHECK
if(pair.getLhsType() instanceof PlaceholderType
&& pair.getRhsType().getTypeParams().occurs((PlaceholderType) pair.getLhsType()))
return Optional.empty();
// SUBST - Rule
if(lhsType instanceof PlaceholderType) {
mgu.add((PlaceholderType) lhsType, rhsType);
//PL 2018-04-01 nach checken, ob es richtig ist, dass keine Substitutionen uebergeben werden muessen.
termsList = termsList.stream().map(x -> mgu.apply(x)).collect(Collectors.toCollection(ArrayList::new));
idx = idx+1 == termsList.size() ? 0 : idx+1;
continue;
}
idx++;
}
return Optional.of(mgu);
}
}
@@ -0,0 +1,92 @@
package de.dhbwstuttgart.typeinference.unify;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import de.dhbwstuttgart.typeinference.unify.interfaces.IMatch;
import de.dhbwstuttgart.typeinference.unify.model.PairOperator;
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
import de.dhbwstuttgart.typeinference.unify.model.TypeParams;
import de.dhbwstuttgart.typeinference.unify.model.Unifier;
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
import de.dhbwstuttgart.typeinference.unify.model.UnifyType;
/**
* Implementation of match derived from unification algorithm.
* @author Martin Pluemicke
*/
public class Match implements IMatch {
@Override
//vorne muss das Pattern stehen
//A<X> =. A<Integer> ==> True
//A<Integer> =. A<X> ==> False
public Optional<Unifier> match(ArrayList<UnifyPair> termsList) {
// Start with the identity unifier. Substitutions will be added later.
Unifier mgu = Unifier.identity();
// Apply rules while possible
int idx = 0;
while(idx < termsList.size()) {
UnifyPair pair = termsList.get(idx);
UnifyType rhsType = pair.getRhsType();
UnifyType lhsType = pair.getLhsType();
TypeParams rhsTypeParams = rhsType.getTypeParams();
TypeParams lhsTypeParams = lhsType.getTypeParams();
// REDUCE - Rule
if(!(rhsType instanceof PlaceholderType) && !(lhsType instanceof PlaceholderType)) {
Set<UnifyPair> result = new HashSet<>();
// f<...> = g<...> with f != g are not unifiable
if(!rhsType.getName().equals(lhsType.getName()))
return Optional.empty(); // conflict
// f<t1,...,tn> = f<s1,...,sm> are not unifiable
if(rhsTypeParams.size() != lhsTypeParams.size())
return Optional.empty(); // conflict
// f = g is not unifiable (cannot be f = f because erase rule would have been applied)
//if(rhsTypeParams.size() == 0)
//return Optional.empty();
// Unpack the arguments
for(int i = 0; i < rhsTypeParams.size(); i++)
result.add(new UnifyPair(lhsTypeParams.get(i), rhsTypeParams.get(i), PairOperator.EQUALSDOT));
termsList.remove(idx);
termsList.addAll(result);
continue;
}
// DELETE - Rule
if(pair.getRhsType().equals(pair.getLhsType())) {
termsList.remove(idx);
continue;
}
// SWAP - Rule
if(!(lhsType instanceof PlaceholderType) && (rhsType instanceof PlaceholderType)) {
return Optional.empty(); // conflict
}
// OCCURS-CHECK
//deleted
// SUBST - Rule
if(lhsType instanceof PlaceholderType) {
mgu.add((PlaceholderType) lhsType, rhsType);
termsList = termsList.stream().map(mgu::applyleft).collect(Collectors.toCollection(ArrayList::new));
idx = idx+1 == termsList.size() ? 0 : idx+1;
continue;
}
idx++;
}
return Optional.of(mgu);
}
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,125 @@
package de.dhbwstuttgart.typeinference.unify;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ForkJoinPool;
import de.dhbwstuttgart.typeinference.constraints.Constraint;
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
import de.dhbwstuttgart.typeinference.constraints.Pair;
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
import de.dhbwstuttgart.typeinference.unify.model.FiniteClosure;
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
public class TypeUnify {
public static Writer statistics;
/**
* unify parallel ohne result modell
* @param undConstrains
* @param oderConstraints
* @param fc
* @param logFile
* @param log
* @param cons
* @return
*/
public Set<Set<UnifyPair>> unify(Set<UnifyPair> undConstrains, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) {
TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks);
ForkJoinPool pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors(), ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
pool.invoke(unifyTask);
Set<Set<UnifyPair>> res = unifyTask.join();
try {
logFile.write("\nnoShortendElements: " + unifyTask.noShortendElements + "\n");
logFile.flush();
}
catch (IOException e) {
System.err.println("no log-File");
}
return res;
}
/**
* unify asynchron mit Rückgabe UnifyResultModel ohne dass alle results gesammelt sind
* @param undConstrains
* @param oderConstraints
* @param fc
* @param logFile
* @param log
* @param cons
* @param ret
* @return
*/
public UnifyResultModel unifyAsync(Set<UnifyPair> undConstrains, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) {
TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks);
ForkJoinPool pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors(), ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
pool.invoke(unifyTask);
return ret;
}
/**
* unify parallel mit Rückgabe UnifyResultModel nachdem alle results gesammelt sind
* @param undConstrains
* @param oderConstraints
* @param fc
* @param logFile
* @param log
* @param cons
* @param ret
* @return
*/
public UnifyResultModel unifyParallel(Set<UnifyPair> undConstrains, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) {
TypeUnifyTask unifyTask = //new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks);
new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks, statistics);
ForkJoinPool pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors(), ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
pool.invoke(unifyTask);
Set<Set<UnifyPair>> res = unifyTask.join();
try {
logFile.write("\nnoShortendElements: " + unifyTask.noShortendElements +"\n");
logFile.flush();
unifyTask.statistics.write("Backtracking: " + unifyTask.noBacktracking);
unifyTask.statistics.write("\nLoops: " + unifyTask.noLoop);
}
catch (IOException e) {
System.err.println("no log-File");
}
return ret;
}
/*
public Set<Set<UnifyPair>> unifySequential(Set<UnifyPair> eq, IFiniteClosure fc, FileWriter logFile, Boolean log) {
TypeUnifyTask unifyTask = new TypeUnifyTask(eq, fc, false, logFile, log);
Set<Set<UnifyPair>> res = unifyTask.compute();
return res;
}
*/
/**
* unify sequentiell mit oderconstraints
* @param undConstrains
* @param oderConstraints
* @param fc
* @param logFile
* @param log
* @param cons
* @return
*/
public Set<Set<UnifyPair>> unifyOderConstraints(Set<UnifyPair> undConstrains, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) {
TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, false, logFile, log, 0, ret, usedTasks);
unifyTask.statistics = statistics;
Set<Set<UnifyPair>> res = unifyTask.compute();
try {
logFile.write("\nnoShortendElements: " + unifyTask.noShortendElements +"\n");
logFile.flush();
}
catch (IOException e) {
System.err.println("no log-File");
}
return res;
}
}
@@ -0,0 +1,76 @@
package de.dhbwstuttgart.typeinference.unify;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import de.dhbwstuttgart.typeinference.constraints.Constraint;
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
import de.dhbwstuttgart.typeinference.constraints.Pair;
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
public class TypeUnify2Task extends TypeUnifyTask {
Set<Set<UnifyPair>> setToFlatten;
Set<UnifyPair> methodSignatureConstraintUebergabe;
//statistics
TypeUnify2Task(Set<Set<UnifyPair>> setToFlatten, Set<UnifyPair> eq,
List<Set<Constraint<UnifyPair>>> oderConstraints,
Set<UnifyPair> nextSetElement,
IFiniteClosure fc, boolean parallel, Writer logFile, Boolean log, int rekTiefe, UnifyResultModel urm, UnifyTaskModel usedTasks,
Set<UnifyPair> methodSignatureConstraintUebergabe, Writer statistics) {
this(setToFlatten, eq, oderConstraints, nextSetElement, fc, parallel, logFile, log, rekTiefe, urm, usedTasks, methodSignatureConstraintUebergabe );
}
public TypeUnify2Task(Set<Set<UnifyPair>> setToFlatten, Set<UnifyPair> eq, List<Set<Constraint<UnifyPair>>> oderConstraints, Set<UnifyPair> nextSetElement, IFiniteClosure fc, boolean parallel, Writer logFile, Boolean log, int rekTiefe, UnifyResultModel urm, UnifyTaskModel usedTasks, Set<UnifyPair> methodSignatureConstraintUebergabe) {
super(eq, oderConstraints, fc, parallel, logFile, log, rekTiefe, urm, usedTasks);
this.setToFlatten = setToFlatten;
this.nextSetElement = nextSetElement;
this.methodSignatureConstraintUebergabe = methodSignatureConstraintUebergabe;
}
Set<UnifyPair> getNextSetElement() {
return nextSetElement;
}
@Override
protected Set<Set<UnifyPair>> compute() {
if (one) {
System.out.println("two");
}
one = true;
Set<Set<UnifyPair>> res = unify2(setToFlatten, eq, oderConstraintsField, fc, parallel, rekTiefeField, methodSignatureConstraintUebergabe);
/*if (isUndefinedPairSetSet(res)) {
return new HashSet<>(); }
else
*/
//writeLog("xxx");
//noOfThread--;
synchronized (usedTasks) {
if (this.myIsCancelled()) {
return new HashSet<>();
}
else {
return res;
}
}
}
public void closeLogFile() {
try {
logFile.close();
}
catch (IOException ioE) {
System.err.println("no log-File" + thNo);
}
}
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,11 @@
package de.dhbwstuttgart.typeinference.unify;
import java.util.Set;
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
public interface Unifikationsalgorithmus {
public Set<Set<UnifyPair>> apply (Set<UnifyPair> E);
}
@@ -0,0 +1,18 @@
package de.dhbwstuttgart.typeinference.unify;
import java.sql.ResultSet;
import java.util.List;
public class UnifyResultEvent {
private List<ResultSet> newTypeResult;
public UnifyResultEvent(List<ResultSet> newTypeResult) {
this.newTypeResult = newTypeResult;
}
public List<ResultSet> getNewTypeResult() {
return newTypeResult;
}
}
@@ -0,0 +1,7 @@
package de.dhbwstuttgart.typeinference.unify;
public interface UnifyResultListener {
void onNewTypeResultFound(UnifyResultEvent evt);
}
@@ -0,0 +1,21 @@
package de.dhbwstuttgart.typeinference.unify;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
public class UnifyResultListenerImpl implements UnifyResultListener {
List<ResultSet> results = new ArrayList<>();
public synchronized void onNewTypeResultFound(UnifyResultEvent evt) {
results.addAll(evt.getNewTypeResult());
}
public List<ResultSet> getResults() {
return results;
}
}
@@ -0,0 +1,41 @@
package de.dhbwstuttgart.typeinference.unify;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
import de.dhbwstuttgart.typeinference.unify.model.PairOperator;
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
public class UnifyResultModel {
ConstraintSet<de.dhbwstuttgart.typeinference.constraints.Pair> cons;
IFiniteClosure fc;
public UnifyResultModel(ConstraintSet<de.dhbwstuttgart.typeinference.constraints.Pair> cons,
IFiniteClosure fc) {
this.cons = cons;
this.fc = fc;
}
private List<UnifyResultListener> listeners = new ArrayList<>();
public void addUnifyResultListener(UnifyResultListener listenerToAdd) {
listeners.add(listenerToAdd);
}
public void removeUnifyResultListener(UnifyResultListener listenerToRemove) {
listeners.remove(listenerToRemove);
}
public void notify(Set<Set<UnifyPair>> eqPrimePrimeSet) {
}
}
@@ -0,0 +1,18 @@
package de.dhbwstuttgart.typeinference.unify;
import java.util.ArrayList;
public class UnifyTaskModel {
ArrayList<TypeUnifyTask> usedTasks = new ArrayList<>();
public synchronized void add(TypeUnifyTask t) {
usedTasks.add(t);
}
public synchronized void cancel() {
for(TypeUnifyTask t : usedTasks) {
t.myCancel(true);
}
}
}
@@ -0,0 +1,54 @@
package de.dhbwstuttgart.typeinference.unify;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import de.dhbwstuttgart.typeinference.unify.model.FunNType;
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
import de.dhbwstuttgart.typeinference.unify.model.TypeParams;
import de.dhbwstuttgart.typeinference.unify.model.UnifyType;
public class distributeVariance extends visitUnifyTypeVisitor<Integer> {
public static int inverseVariance(int variance) {
Integer ret = 0;
if (variance == 1) {
ret = -1;
}
if (variance == -1) {
ret = 1;
}
return ret;
}
@Override
public PlaceholderType visit(PlaceholderType phty, Integer ht) {
if (ht != 0) {
if (phty.getVariance() == 0) {
phty.setVariance(ht);
}
//PL 2018-05-17 urspruengliche Variance nicht veraendern
//else if (phty.getVariance() != ht) {
// phty.setVariance(0);
//}
}
return phty;
}
public FunNType visit(FunNType funnty, Integer ht) {
List<UnifyType> param = new ArrayList<>(funnty.getTypeParams().get().length);
param.addAll(Arrays.asList(funnty.getTypeParams().get()));
UnifyType resultType = param.remove(param.size()-1);
Integer htInverse = inverseVariance(ht);
param = param.stream()
.map(x -> x.accept(this, htInverse))
.collect(Collectors.toCollection(ArrayList::new));
param.add(resultType.accept(this, ht));
return FunNType.getFunNType(new TypeParams(param));
}
}
@@ -0,0 +1,15 @@
package de.dhbwstuttgart.typeinference.unify;
import java.util.HashMap;
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
public class freshPlaceholder extends visitUnifyTypeVisitor<HashMap<PlaceholderType,PlaceholderType>> {
@Override
public PlaceholderType visit(PlaceholderType phty, HashMap<PlaceholderType,PlaceholderType> ht) {
return ht.get(phty);
}
}
@@ -0,0 +1,68 @@
package de.dhbwstuttgart.typeinference.unify.interfaces;
import java.util.Optional;
import java.util.Set;
import de.dhbwstuttgart.typeinference.unify.model.ExtendsType;
import de.dhbwstuttgart.typeinference.unify.model.FunNType;
import de.dhbwstuttgart.typeinference.unify.model.PairOperator;
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
import de.dhbwstuttgart.typeinference.unify.model.ReferenceType;
import de.dhbwstuttgart.typeinference.unify.model.SuperType;
import de.dhbwstuttgart.typeinference.unify.model.UnifyType;
/**
*
* @author Florian Steurer
*/
public interface IFiniteClosure {
public void setLogTrue();
/**
* Returns all types of the finite closure that are subtypes of the argument.
* @return The set of subtypes of the argument.
*/
public Set<UnifyType> smaller(UnifyType type, Set<UnifyType> fBounded);
/**
* Returns all types of the finite closure that are supertypes of the argument.
* @return The set of supertypes of the argument.
*/
public Set<UnifyType> greater(UnifyType type, Set<UnifyType> fBounded);
/**
* Wo passt Type rein?
* @param type
* @return
*/
public Set<UnifyType> grArg(UnifyType type, Set<UnifyType> fBounded);
/**
* Was passt in Type rein?
* @param type
* @return
*/
public Set<UnifyType> smArg(UnifyType type, Set<UnifyType> fBounded);
public Set<UnifyType> grArg(ReferenceType type, Set<UnifyType> fBounded);
public Set<UnifyType> smArg(ReferenceType type, Set<UnifyType> fBounded);
public Set<UnifyType> grArg(ExtendsType type, Set<UnifyType> fBounded);
public Set<UnifyType> smArg(ExtendsType type, Set<UnifyType> fBounded);
public Set<UnifyType> grArg(SuperType type, Set<UnifyType> fBounded);
public Set<UnifyType> smArg(SuperType type, Set<UnifyType> fBounded);
public Set<UnifyType> grArg(PlaceholderType type, Set<UnifyType> fBounded);
public Set<UnifyType> smArg(PlaceholderType type, Set<UnifyType> fBounded);
public Set<UnifyType> grArg(FunNType type, Set<UnifyType> fBounded);
public Set<UnifyType> smArg(FunNType type, Set<UnifyType> fBounded);
public Optional<UnifyType> getLeftHandedType(String typeName);
public Set<UnifyType> getAncestors(UnifyType t);
public Set<UnifyType> getChildren(UnifyType t);
public Set<UnifyType> getAllTypesByName(String typeName);
public int compare(UnifyType rhsType, UnifyType rhsType2, PairOperator pairop);
}
@@ -0,0 +1,29 @@
package de.dhbwstuttgart.typeinference.unify.interfaces;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import de.dhbwstuttgart.typeinference.unify.model.UnifyType;
import de.dhbwstuttgart.typeinference.unify.model.Unifier;
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
/**
* Match
* @author Martin Pluemicke
* abgeleitet aus IUnify.java
*/
public interface IMatch {
/**
* Finds the most general matcher sigma of the set {t1 =. t1',...,tn =. tn'} so that
* sigma(t1) = t1' , ... sigma(tn) = tn'.
* @param terms The set of terms to be matched
* @return An optional of the most general matcher if it exists or an empty optional if there is no matcher.
*/
public Optional<Unifier> match(ArrayList<UnifyPair> termsList);
}
@@ -0,0 +1,103 @@
package de.dhbwstuttgart.typeinference.unify.interfaces;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import de.dhbwstuttgart.typeinference.constraints.Constraint;
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
/**
* Contains the inference rules that are applied to the set Eq.
* @author Florian Steurer
*/
public interface IRuleSet {
public Optional<UnifyPair> reduceUp(UnifyPair pair);
public Optional<UnifyPair> reduceLow(UnifyPair pair);
public Optional<UnifyPair> reduceUpLow(UnifyPair pair);
public Optional<Set<UnifyPair>> reduceExt(UnifyPair pair, IFiniteClosure fc);
public Optional<Set<UnifyPair>> reduceSup(UnifyPair pair, IFiniteClosure fc);
public Optional<Set<UnifyPair>> reduceEq(UnifyPair pair);
public Optional<Set<UnifyPair>> reduce1(UnifyPair pair, IFiniteClosure fc);
public Optional<Set<UnifyPair>> reduce2(UnifyPair pair);
/*
* Missing Reduce-Rules for Wildcards
*/
public Optional<UnifyPair> reduceWildcardLow(UnifyPair pair);
public Optional<UnifyPair> reduceWildcardLowRight(UnifyPair pair);
public Optional<UnifyPair> reduceWildcardUp(UnifyPair pair);
public Optional<UnifyPair> reduceWildcardUpRight(UnifyPair pair);
/*
* vgl. JAVA_BSP/Wildcard6.java
public Optional<UnifyPair> reduceWildcardLowUp(UnifyPair pair);
public Optional<UnifyPair> reduceWildcardUpLow(UnifyPair pair);
public Optional<UnifyPair> reduceWildcardLeft(UnifyPair pair);
*/
/*
* Additional Rules which replace cases of the cartesian product
*/
/**
* Rule that replaces the fourth case of the cartesian product where (a <.? Theta)
*/
public Optional<UnifyPair> reduceTph(UnifyPair pair);
/**
* Rule that replaces the sixth case of the cartesian product where (? ext Theta <.? a)
*/
public Optional<Set<UnifyPair>> reduceTphExt(UnifyPair pair);
/**
* Rule that replaces the fourth case of the cartesian product where (? sup Theta <.? a)
*/
public Optional<Set<UnifyPair>> reduceTphSup(UnifyPair pair);
/*
* FunN Rules
*/
public Optional<Set<UnifyPair>> reduceFunN(UnifyPair pair);
public Optional<Set<UnifyPair>> greaterFunN(UnifyPair pair);
public Optional<Set<UnifyPair>> smallerFunN(UnifyPair pair);
/**
* Checks whether the erase1-Rule applies to the pair.
* @return True if the pair is erasable, false otherwise.
*/
public boolean erase1(UnifyPair pair, IFiniteClosure fc);
/**
* Checks whether the erase2-Rule applies to the pair.
* @return True if the pair is erasable, false otherwise.
*/
public boolean erase2(UnifyPair pair, IFiniteClosure fc);
/**
* Checks whether the erase3-Rule applies to the pair.
* @return True if the pair is erasable, false otherwise.
*/
public boolean erase3(UnifyPair pair);
public Optional<UnifyPair> swap(UnifyPair pair);
public Optional<UnifyPair> adapt(UnifyPair pair, IFiniteClosure fc);
public Optional<UnifyPair> adaptExt(UnifyPair pair, IFiniteClosure fc);
public Optional<UnifyPair> adaptSup(UnifyPair pair, IFiniteClosure fc);
/**
* Applies the subst-Rule to a set of pairs (usually Eq').
* @param pairs The set of pairs where the subst rule should apply.
* @return An optional of the modified set, if there were any substitutions. An empty optional if there were no substitutions.
*/
public Optional<Set<UnifyPair>> subst(Set<UnifyPair> pairs, List<Set<Constraint<UnifyPair>>> oderConstraints);
/**
* Applies the subst-Rule to a set of pairs (usually Eq').
* @param pairs The set of pairs where the subst rule should apply.
* @return An optional of the modified set, if there were any substitutions. An empty optional if there were no substitutions.
*/
public Optional<Set<UnifyPair>> subst(Set<UnifyPair> pairs);
}
@@ -0,0 +1,16 @@
package de.dhbwstuttgart.typeinference.unify.interfaces;
import java.util.List;
import java.util.Set;
/**
* Contains operations on sets.
* @author Florian Steurer
*/
public interface ISetOperations {
/**
* Calculates the cartesian product of the sets.
* @return The cartesian product
*/
<B> Set<List<B>> cartesianProduct(List<? extends Set<? extends B>> sets);
}
@@ -0,0 +1,35 @@
package de.dhbwstuttgart.typeinference.unify.interfaces;
import java.util.Arrays;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import de.dhbwstuttgart.typeinference.unify.model.UnifyType;
import de.dhbwstuttgart.typeinference.unify.model.Unifier;
/**
* Standard unification algorithm (e.g. Robinson, Paterson-Wegman, Martelli-Montanari)
* @author Florian Steurer
*/
public interface IUnify {
/**
* Finds the most general unifier sigma of the set {t1 =. t1',...,tn =. tn'} so that
* sigma(t1) = sigma(t1') , ... sigma(tn) = sigma(tn').
* @param terms The set of terms to be unified
* @return An optional of the most general unifier if it exists or an empty optional if there is no unifier.
*/
public Optional<Unifier> unify(Set<UnifyType> terms);
/**
* Finds the most general unifier sigma of the set {t1 =. t1',...,tn =. tn'} so that
* sigma(t1) = sigma(t1') , ... sigma(tn) = sigma(tn').
* @param terms The set of terms to be unified
* @return An optional of the most general unifier if it exists or an empty optional if there is no unifier.
*/
default public Optional<Unifier> unify(UnifyType... terms) {
return unify(Arrays.stream(terms).collect(Collectors.toSet()));
}
}
@@ -0,0 +1,23 @@
package de.dhbwstuttgart.typeinference.unify.interfaces;
import java.util.HashMap;
import de.dhbwstuttgart.typeinference.unify.model.ExtendsType;
import de.dhbwstuttgart.typeinference.unify.model.FunNType;
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
import de.dhbwstuttgart.typeinference.unify.model.ReferenceType;
import de.dhbwstuttgart.typeinference.unify.model.SuperType;
public interface UnifyTypeVisitor<T> {
public ReferenceType visit(ReferenceType refty, T ht);
public PlaceholderType visit(PlaceholderType phty, T ht);
public FunNType visit(FunNType funnty, T ht);
public SuperType visit(SuperType suty, T ht);
public ExtendsType visit(ExtendsType extty, T ht);
}
@@ -0,0 +1,96 @@
package de.dhbwstuttgart.typeinference.unify.model;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Set;
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
import de.dhbwstuttgart.typeinference.unify.interfaces.UnifyTypeVisitor;
/**
* An extends wildcard type "? extends T".
*/
public final class ExtendsType extends WildcardType {
public <T> UnifyType accept(UnifyTypeVisitor<T> visitor, T ht) {
return visitor.visit(this, ht);
}
/**
* Creates a new extends wildcard type.
* @param extendedType The extended type e.g. Integer in "? extends Integer"
*/
public ExtendsType(UnifyType extendedType) {
super("? extends " + extendedType.getName(), extendedType);
if (extendedType instanceof ExtendsType) {
System.out.print("");
}
}
/**
* The extended type e.g. Integer in "? extends Integer"
*/
public UnifyType getExtendedType() {
return wildcardedType;
}
/**
* Sets the type parameters of the wildcarded type and returns a new extendstype that extends that type.
*/
@Override
public UnifyType setTypeParams(TypeParams newTp) {
UnifyType newType = wildcardedType.setTypeParams(newTp);
if(newType == wildcardedType)
return this; // Reduced the amount of objects created
return new ExtendsType(wildcardedType.setTypeParams(newTp));
}
@Override
Set<UnifyType> smArg(IFiniteClosure fc, Set<UnifyType> fBounded) {
return fc.smArg(this, fBounded);
}
@Override
Set<UnifyType> grArg(IFiniteClosure fc, Set<UnifyType> fBounded) {
return fc.grArg(this, fBounded);
}
@Override
UnifyType apply(Unifier unif) {
UnifyType newType = wildcardedType.apply(unif);
if(newType.hashCode() == wildcardedType.hashCode() && newType.equals(wildcardedType))
return this; // Reduced the amount of objects created
return new ExtendsType(newType);
}
@Override
public int hashCode() {
/*
* It is important that the prime that is added is different to the prime added in hashCode() of SuperType.
* Otherwise ? extends T and ? super T have the same hashCode() for every Type T.
*/
return wildcardedType.hashCode() + 229;
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof ExtendsType))
return false;
if(obj.hashCode() != this.hashCode())
return false;
ExtendsType other = (ExtendsType) obj;
return other.getWildcardedType().equals(wildcardedType);
}
@Override
public String toString() {
return "? extends " + wildcardedType;
}
}
@@ -0,0 +1,772 @@
package de.dhbwstuttgart.typeinference.unify.model;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.function.BiFunction;
import java.util.function.BinaryOperator;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import com.google.common.collect.Ordering;
//PL 18-02-05/18-04-05 Unifier durch Matcher ersetzt
//muss greater noch ersetzt werden ja erledigt 18--04-05
import de.dhbwstuttgart.typeinference.unify.MartelliMontanariUnify;
import de.dhbwstuttgart.typeinference.unify.Match;
import de.dhbwstuttgart.typeinference.unify.TypeUnifyTask;
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
import de.dhbwstuttgart.typeinference.unify.interfaces.IUnify;
import de.dhbwstuttgart.util.Pair;
/**
* The finite closure for the type unification
* @author Florian Steurer
*/
public class FiniteClosure //extends Ordering<UnifyType> //entfernt PL 2018-12-11
implements IFiniteClosure {
Writer logFile;
static Boolean log = false;
public void setLogTrue() {
log = true;
}
/**
* A map that maps every type to the node in the inheritance graph that contains that type.
*/
private HashMap<UnifyType, Node<UnifyType>> inheritanceGraph;
/**
* A map that maps every typename to the nodes of the inheritance graph that contain a type with that name.
*/
private HashMap<String, Set<Node<UnifyType>>> strInheritanceGraph;
/**
* The initial pairs of that define the inheritance tree
*/
private Set<UnifyPair> pairs;
/**
* Hastable fuer die greater-Werte, damit sie nicht doppelt berechnet werden muessen
*/
Hashtable<hashKeyType, Set<UnifyType>> greaterHash = new Hashtable<>();
/**
* Hastable fuer die smaller-Werte, damit sie nicht doppelt berechnet werden muessen
*/
Hashtable<hashKeyType, Set<UnifyType>> smallerHash = new Hashtable<>();
/**
* Creates a new instance using the inheritance tree defined in the pairs.
*/
public FiniteClosure(Set<UnifyPair> pairs, Writer logFile) {
this.logFile = logFile;
this.pairs = new HashSet<>(pairs);
inheritanceGraph = new HashMap<UnifyType, Node<UnifyType>>();
// Build the transitive closure of the inheritance tree
for(UnifyPair pair : pairs) {
/*
try {
logFile.write("Pair: " + pair + "\n");
logFile.flush();
}
catch (IOException e) {
System.err.println("no LogFile");
}
*/
if(pair.getPairOp() != PairOperator.SMALLER)
continue;
//VERSUCH PL 18-02-06
//koennte ggf. die FC reduzieren
//TO DO: Ueberpruefen, ob das sinnvll und korrekt ist
//if (!pair.getLhsType().getTypeParams().arePlaceholders()
// && !pair.getRhsType().getTypeParams().arePlaceholders())
// continue;
;
// Add nodes if not already in the graph
if(!inheritanceGraph.containsKey(pair.getLhsType()))
inheritanceGraph.put(pair.getLhsType(), new Node<UnifyType>(pair.getLhsType()));
if(!inheritanceGraph.containsKey(pair.getRhsType()))
inheritanceGraph.put(pair.getRhsType(), new Node<UnifyType>(pair.getRhsType()));
Node<UnifyType> childNode = inheritanceGraph.get(pair.getLhsType());
Node<UnifyType> parentNode = inheritanceGraph.get(pair.getRhsType());
// Add edge
parentNode.addDescendant(childNode);
// Add edges to build the transitive closure
parentNode.getPredecessors().stream().forEach(x -> x.addDescendant(childNode));
childNode.getDescendants().stream().forEach(x -> x.addPredecessor(parentNode));
//PL eingefuegt 2020-05-07 File UnitTest InheritTest.java
this.inheritanceGraph.forEach((x,y) -> { if (y.getDescendants().contains(parentNode)) { y.addDescendant(childNode); y.addAllDescendant(childNode.getDescendants());};
if (y.getPredecessors().contains(childNode)) { y.addPredecessor(parentNode); y.addAllPredecessor(parentNode.getPredecessors());};} );
}
// Build the alternative representation with strings as keys
strInheritanceGraph = new HashMap<>();
for(UnifyType key : inheritanceGraph.keySet()) {
if(!strInheritanceGraph.containsKey(key.getName()))
strInheritanceGraph.put(key.getName(), new HashSet<>());
strInheritanceGraph.get(key.getName()).add(inheritanceGraph.get(key));
}
}
void testSmaller() {
UnifyType tq1, tq2, tq3;
tq1 = new ExtendsType(PlaceholderType.freshPlaceholder());
List<UnifyType> l1 = new ArrayList<>();
List<UnifyType> l2 = new ArrayList<>();
l1.add(tq1);
tq2 = new ReferenceType("java.util.Vector", new TypeParams(l1));
l2.add(tq2);
tq3 = new ReferenceType("java.util.Vector", new TypeParams(l2));
Set<UnifyType> smaller = smaller(tq3, new HashSet<>());
}
/**
* Returns all types of the finite closure that are subtypes of the argument.
* @return The set of subtypes of the argument.
*/
@Override
public Set<UnifyType> smaller(UnifyType type, Set<UnifyType> fBounded) {
Set<UnifyType> ret;
if ((ret = smallerHash.get(new hashKeyType(type))) != null) {
//System.out.println(greaterHash);
return new HashSet<>(ret);
}
if(type instanceof FunNType)
return computeSmallerFunN((FunNType) type, fBounded);
Set<Pair<UnifyType,Set<UnifyType>>> ts = new HashSet<>();
ts.add(new Pair<>(type, fBounded));
Set<UnifyType> result = computeSmaller(ts);
smallerHash.put(new hashKeyType(type), result);
/*
try {
logFile.write("\ntype: " + type + "\nret: " + ret + "\nresult: " + result);//"smallerHash: " + greaterHash.toString());
logFile.flush();
}
catch (IOException e) {
System.err.println("no LogFile");
}*/
return result;
}
/**
* Computes the smaller functions for every type except FunNTypes.
*/
private Set<UnifyType> computeSmaller(Set<Pair<UnifyType,Set<UnifyType>>> types) {
Set<Pair<UnifyType,Set<UnifyType>>> result = new HashSet<>();
//PL 18-02-05 Unifier durch Matcher ersetzt
//IUnify unify = new MartelliMontanariUnify();
Match match = new Match();
for(Pair<UnifyType,Set<UnifyType>> pt : types) {
UnifyType t = pt.getKey();
Set<UnifyType> fBounded = pt.getValue().get();
// if T = T' then T <* T'
try {
result.add(new Pair<>(t, fBounded));
}
catch (StackOverflowError e) {
System.out.println("");
}
// if C<...> <* C<...> then ... (third case in definition of <*)
if(t.getTypeParams().size() > 0) {
ArrayList<Set<UnifyType>> paramCandidates = new ArrayList<>();
for (int i = 0; i < t.getTypeParams().size(); i++)
paramCandidates.add(smArg(t.getTypeParams().get(i), fBounded));
permuteParams(paramCandidates).forEach(x -> result.add(new Pair<>(t.setTypeParams(x), fBounded)));
}
if(!strInheritanceGraph.containsKey(t.getName()))
continue;
// if T <* T' then sigma(T) <* sigma(T')
Set<Node<UnifyType>> candidates = strInheritanceGraph.get(t.getName()); //cadidates= [???Node(java.util.Vector<java.util.Vector<java.lang.Integer>>)???
// , Node(java.util.Vector<gen_hv>)
//]
for(Node<UnifyType> candidate : candidates) {
UnifyType theta2 = candidate.getContent();
//PL 18-02-05 Unifier durch Matcher ersetzt ANFANG
ArrayList<UnifyPair> termList= new ArrayList<UnifyPair>();
termList.add(new UnifyPair(theta2,t, PairOperator.EQUALSDOT));
Optional<Unifier> optSigma = match.match(termList);
//PL 18-02-05 Unifier durch Matcher ersetzt ENDE
if(!optSigma.isPresent())
continue;
Unifier sigma = optSigma.get();
sigma.swapPlaceholderSubstitutions(t.getTypeParams());
Set<UnifyType> theta1Set = candidate.getContentOfDescendants();
for(UnifyType theta1 : theta1Set)
result.add(new Pair<>(theta1.apply(sigma), fBounded));
}
}
HashSet<UnifyType> resut = result.stream().map(x -> x.getKey()).collect(Collectors.toCollection(HashSet::new));
if(resut.equals(types.stream().map(x -> x.getKey()).collect(Collectors.toCollection(HashSet::new))))
return resut;
return computeSmaller(result);
}
/**
* Computes the smaller-Function for FunNTypes.
*/
private Set<UnifyType> computeSmallerFunN(FunNType type, Set<UnifyType> fBounded) {
Set<UnifyType> result = new HashSet<>();
// if T = T' then T <=* T'
result.add(type);
// Because real function types are implicitly variant
// it is enough to permute the params with the values of greater / smaller.
ArrayList<Set<UnifyType>> paramCandidates = new ArrayList<>();
paramCandidates.add(smaller(type.getTypeParams().get(0), fBounded));
for (int i = 1; i < type.getTypeParams().size(); i++)
paramCandidates.add(greater(type.getTypeParams().get(i), new HashSet<>()));
permuteParams(paramCandidates).forEach(x -> result.add(type.setTypeParams(x)));
return result;
}
/**
* Returns all types of the finite closure that are supertypes of the argument.
* @return The set of supertypes of the argument.
*/
@Override
//Eingefuegt PL 2018-05-24 F-Bounded Problematik
public Set<UnifyType> greater(UnifyType type, Set<UnifyType> fBounded) {
Set<UnifyType> ret;
if ((ret = greaterHash.get(new hashKeyType(type))) != null) {
//System.out.println(greaterHash);
return new HashSet<>(ret);
}
if(type instanceof FunNType) {
return computeGreaterFunN((FunNType) type, fBounded);
}
Set<UnifyType> result = new HashSet<>();
Set<Pair<UnifyType,Set<UnifyType>>> PairResultFBounded = new HashSet<>();
Match match = new Match();
// if T = T' then T <=* T'
result.add(type);
if(!strInheritanceGraph.containsKey(type.getName()))
return result;
// if T <* T' then sigma(T) <* sigma(T')
Set<Node<UnifyType>> candidates = strInheritanceGraph.get(type.getName());
/*
try {
if (log) logFile.write(candidates.toString());
//log = false;
}
catch (IOException e) {
System.err.println("no LogFile");
}
*/
for(Node<UnifyType> candidate : candidates) {
UnifyType theta1 = candidate.getContent();
//PL 18-04-05 Unifier durch Matcher ersetzt ANFANG
ArrayList<UnifyPair> termList= new ArrayList<UnifyPair>();
termList.add(new UnifyPair(theta1,type, PairOperator.EQUALSDOT));
Optional<Unifier> optSigma = match.match(termList);
//PL 18-04-05 Unifier durch Matcher ersetzt ENDE
if(!optSigma.isPresent()) {
continue;
}
Unifier sigma = optSigma.get();
sigma.swapPlaceholderSubstitutionsReverse(theta1.getTypeParams());
Set<UnifyType> fBoundedNew = new HashSet<>(fBounded);
fBoundedNew.add(theta1);
Set<UnifyType> theta2Set = candidate.getContentOfPredecessors();
//System.out.println("");
for(UnifyType theta2 : theta2Set) {
result.add(theta2.apply(sigma));
PairResultFBounded.add(new Pair<>(theta2.apply(sigma), fBoundedNew));
}
}
/*
try {
if (log) logFile.write(PairResultFBounded.toString());
log = false;
}
catch (IOException e) {
System.err.println("no LogFile");
}
*/
for(Pair<UnifyType,Set<UnifyType>> pt : PairResultFBounded) {
UnifyType t = pt.getKey();
Set<UnifyType> lfBounded = pt.getValue().get();
// if C<...> <* C<...> then ... (third case in definition of <*)
//TypeParams typeparams = t.getTypeParams();
if(t.getTypeParams().size() > 0) {
ArrayList<Set<UnifyType>> paramCandidates = new ArrayList<>();
for (int i = 0; i < t.getTypeParams().size(); i++) {
//UnifyType parai = t.getTypeParams().get(i);
int i_ef = i;
BiFunction<Boolean,UnifyType,Boolean> f = (x,y) ->
{
ArrayList<UnifyPair> termList = new ArrayList<UnifyPair>();
termList.add(new UnifyPair(y,t.getTypeParams().get(i_ef), PairOperator.EQUALSDOT));
return ((match.match(termList).isPresent()) || x);
};
//if (parai.getName().equals("java.lang.Integer")) {
// System.out.println("");
//}
BinaryOperator<Boolean> bo = (a,b) -> (a || b);
if (lfBounded.stream().reduce(false,f,bo)) {
//F-Bounded Endlosrekursion
HashSet<UnifyType> res = new HashSet<UnifyType>();
paramCandidates.add(res);
}
else {
paramCandidates.add(grArg(t.getTypeParams().get(i), new HashSet<>(fBounded) ));
}
}
permuteParams(paramCandidates).forEach(x -> result.add(t.setTypeParams(x)));
//System.out.println("");
}
}
greaterHash.put(new hashKeyType(type), result);
/*
try {
logFile.write("\ntype: " + type + "\nret: " + ret + "\nresult: " + result);//"greaterHash: " + greaterHash.toString());
logFile.flush();
}
catch (IOException e) {
System.err.println("no LogFile");
}*/
return result;
}
/* auskommentiert PL 2018-05-24
/**
* Returns all types of the finite closure that are supertypes of the argument.
* @return The set of supertypes of the argument.
*
//@Override
public Set<UnifyType> oldgreater(UnifyType type, Set<UnifyType> fBounded) {
if(type instanceof FunNType)
return computeGreaterFunN((FunNType) type, fBounded);
Set<Pair<UnifyType,Set<UnifyType>>> ts = new HashSet<>();
ts.add(new Pair<>(type, fBounded));
return computeGreater(ts);
}
/**
* Computes the greater function for all types except function types.
*
protected Set<UnifyType> computeGreater(Set<Pair<UnifyType,Set<UnifyType>>> types) {
Set<Pair<UnifyType,Set<UnifyType>>> result = new HashSet<>();
//PL 18-04-05 Unifier durch Matcher ersetzt
//IUnify unify = new MartelliMontanariUnify();
Match match = new Match();
for(Pair<UnifyType,Set<UnifyType>> pt : types) {
UnifyType t = pt.getKey();
Set<UnifyType> fBounded = pt.getValue().get();
// if T = T' then T <=* T'
result.add(pt);
// if C<...> <* C<...> then ... (third case in definition of <*)
if(t.getTypeParams().size() > 0) {
ArrayList<Set<UnifyType>> paramCandidates = new ArrayList<>();
for (int i = 0; i < t.getTypeParams().size(); i++) {
UnifyType parai = t.getTypeParams().get(i);
int i_ef = i;
BiFunction<Boolean,UnifyType,Boolean> f = (x,y) ->
{
ArrayList<UnifyPair> termList = new ArrayList<UnifyPair>();
termList.add(new UnifyPair(y,t.getTypeParams().get(i_ef), PairOperator.EQUALSDOT));
return ((match.match(termList).isPresent()) || x);
};
if (parai.getName().equals("java.lang.Integer")) {
System.out.println("");
}
BinaryOperator<Boolean> bo = (a,b) -> (a || b);
if (fBounded.stream().reduce(false,f,bo)) continue; //F-Bounded Endlosrekursion
paramCandidates.add(grArg(t.getTypeParams().get(i), new HashSet<>(fBounded) ));
}
permuteParams(paramCandidates).forEach(x -> result.add(new Pair<>(t.setTypeParams(x), new HashSet<>(fBounded))));
}
if(!strInheritanceGraph.containsKey(t.getName()))
continue;
// if T <* T' then sigma(T) <* sigma(T')
Set<Node<UnifyType>> candidates = strInheritanceGraph.get(t.getName());
for(Node<UnifyType> candidate : candidates) {
UnifyType theta1 = candidate.getContent();
//PL 18-04-05 Unifier durch Matcher ersetzt ANFANG
ArrayList<UnifyPair> termList= new ArrayList<UnifyPair>();
termList.add(new UnifyPair(theta1,t, PairOperator.EQUALSDOT));
Optional<Unifier> optSigma = match.match(termList);
//PL 18-04-05 Unifier durch Matcher ersetzt ENDE
if(!optSigma.isPresent())
continue;
Unifier sigma = optSigma.get();
sigma.swapPlaceholderSubstitutionsReverse(theta1.getTypeParams());
Set<UnifyType> fBoundedNew = new HashSet<>(fBounded);
fBoundedNew.add(theta1);
Set<UnifyType> theta2Set = candidate.getContentOfPredecessors();
for(UnifyType theta2 : theta2Set)
result.add(new Pair<>(theta2.apply(sigma), fBoundedNew));
}
}
HashSet<UnifyType> resut = result.stream().map(x -> x.getKey()).collect(Collectors.toCollection(HashSet::new));
System.out.println(resut);
if(resut.equals(types.stream().map(x -> x.getKey()).collect(Collectors.toCollection(HashSet::new))))
return resut;
return computeGreater(result);
}
*/
/**
* Computes the greater function for FunN-Types
*/
protected Set<UnifyType> computeGreaterFunN(FunNType type, Set<UnifyType> fBounded) {
Set<UnifyType> result = new HashSet<>();
// if T = T' then T <=* T'
result.add(type);
// Because real function types are implicitly variant
// it is enough to permute the params with the values of greater / smaller.
ArrayList<Set<UnifyType>> paramCandidates = new ArrayList<>();
paramCandidates.add(greater(type.getTypeParams().get(0), new HashSet<>()));
for (int i = 1; i < type.getTypeParams().size(); i++)
paramCandidates.add(smaller(type.getTypeParams().get(i), fBounded));
permuteParams(paramCandidates).forEach(x -> result.add(type.setTypeParams(x)));
return result;
}
@Override
public Set<UnifyType> grArg(UnifyType type, Set<UnifyType> fBounded) {
return type.grArg(this, fBounded);
}
@Override
public Set<UnifyType> grArg(ReferenceType type, Set<UnifyType> fBounded) {
Set<UnifyType> result = new HashSet<UnifyType>();
result.add(type);
smaller(type, fBounded).forEach(x -> result.add(new SuperType(x)));
greater(type,fBounded).forEach(x -> result.add(new ExtendsType(x)));
return result;
}
@Override
public Set<UnifyType> grArg(FunNType type, Set<UnifyType> fBounded) {
Set<UnifyType> result = new HashSet<UnifyType>();
result.add(type);
smaller(type, fBounded).forEach(x -> result.add(new SuperType(x)));
greater(type, fBounded).forEach(x -> result.add(new ExtendsType(x)));
return result;
}
@Override
public Set<UnifyType> grArg(ExtendsType type, Set<UnifyType> fBounded) {
Set<UnifyType> result = new HashSet<UnifyType>();
result.add(type);
UnifyType t = type.getExtendedType();
greater(t, fBounded).forEach(x -> result.add(new ExtendsType(x)));
return result;
}
@Override
public Set<UnifyType> grArg(SuperType type, Set<UnifyType> fBounded) {
Set<UnifyType> result = new HashSet<UnifyType>();
result.add(type);
UnifyType t = type.getSuperedType();
smaller(t, fBounded).forEach(x -> result.add(new SuperType(x)));
return result;
}
@Override
public Set<UnifyType> grArg(PlaceholderType type, Set<UnifyType> fBounded) {
HashSet<UnifyType> result = new HashSet<>();
result.add(type);
return result;
}
@Override
public Set<UnifyType> smArg(UnifyType type, Set<UnifyType> fBounded) {
return type.smArg(this, fBounded);
}
@Override
public Set<UnifyType> smArg(ReferenceType type, Set<UnifyType> fBounded) {
Set<UnifyType> result = new HashSet<UnifyType>();
result.add(type);
return result;
}
@Override
public Set<UnifyType> smArg(FunNType type, Set<UnifyType> fBounded) {
Set<UnifyType> result = new HashSet<UnifyType>();
result.add(type);
return result;
}
@Override
public Set<UnifyType> smArg(ExtendsType type, Set<UnifyType> fBounded) {
Set<UnifyType> result = new HashSet<UnifyType>();
result.add(type);
UnifyType t = type.getExtendedType();
result.add(t);
smaller(t, fBounded).forEach(x -> {
result.add(new ExtendsType(x));
result.add(x);
});
return result;
}
@Override
public Set<UnifyType> smArg(SuperType type, Set<UnifyType> fBounded) {
Set<UnifyType> result = new HashSet<UnifyType>();
result.add(type);
UnifyType t = type.getSuperedType();
result.add(t);
//*** ACHTUNG das koennte FALSCH sein PL 2018-05-23 evtl. HashSet durch smArg durchschleifen
greater(t, fBounded).forEach(x -> {
result.add(new SuperType(x));
result.add(x);
});
return result;
}
@Override
public Set<UnifyType> smArg(PlaceholderType type, Set<UnifyType> fBounded) {
HashSet<UnifyType> result = new HashSet<>();
result.add(type);
return result;
}
@Override
public Set<UnifyType> getAllTypesByName(String typeName) {
if(!strInheritanceGraph.containsKey(typeName))
return new HashSet<>();
return strInheritanceGraph.get(typeName).stream().map(x -> x.getContent()).collect(Collectors.toCollection(HashSet::new));
}
@Override
public Optional<UnifyType> getLeftHandedType(String typeName) {
if(!strInheritanceGraph.containsKey(typeName))
return Optional.empty();
for(UnifyPair pair : pairs)
if(pair.getLhsType().getName().equals(typeName) && pair.getLhsType().typeParams.arePlaceholders())
return Optional.of(pair.getLhsType());
return Optional.empty();
}
@Override
public Set<UnifyType> getAncestors(UnifyType t) {
if(!inheritanceGraph.containsKey(t))
return new HashSet<>();
Set<UnifyType> result = inheritanceGraph.get(t).getContentOfPredecessors();
result.add(t);
return result;
}
@Override
public Set<UnifyType> getChildren(UnifyType t) {
if(!inheritanceGraph.containsKey(t))
return new HashSet<>();
Set<UnifyType> result = inheritanceGraph.get(t).getContentOfDescendants();
result.add(t);
return result;
}
/**
* Takes a set of candidates for each position and computes all possible permutations.
* @param candidates The length of the list determines the number of type params. Each set
* contains the candidates for the corresponding position.
*/
protected Set<TypeParams> permuteParams(ArrayList<Set<UnifyType>> candidates) {
Set<TypeParams> result = new HashSet<>();
permuteParams(candidates, 0, result, new UnifyType[candidates.size()]);
return result;
}
/**
* Takes a set of candidates for each position and computes all possible permutations.
* @param candidates The length of the list determines the number of type params. Each set
* contains the candidates for the corresponding position.
* @param idx Idx for the current permutatiton.
* @param result Set of all permutations found so far
* @param current The permutation of type params that is currently explored
*/
protected void permuteParams(ArrayList<Set<UnifyType>> candidates, int idx, Set<TypeParams> result, UnifyType[] current) {
if(candidates.size() == idx) {
result.add(new TypeParams(Arrays.copyOf(current, current.length)));
return;
}
Set<UnifyType> localCandidates = candidates.get(idx);
for(UnifyType t : localCandidates) {
current[idx] = t;
permuteParams(candidates, idx+1, result, current);
}
}
@Override
public String toString(){
return this.inheritanceGraph.toString();
}
/* entfernt PL 2018-12-11
public int compare (UnifyType left, UnifyType right) {
return compare(left, right, PairOperator.SMALLERDOT);
}
*/
public int compare (UnifyType left, UnifyType right, PairOperator pairop) {
//try {logFile.write("left: "+ left + " right: " + right + " pairop: " + pairop);} catch (IOException ie) {}
if (left.getName().equals("Matrix") || right.getName().equals("Matrix"))
System.out.println("");
/*
pairop = PairOperator.SMALLERDOTWC;
List<UnifyType> al = new ArrayList<>();
PlaceholderType xx =new PlaceholderType("xx");
al.add(xx);
left = new ExtendsType(new ReferenceType("Vector", new TypeParams(al)));
List<UnifyType> alr = new ArrayList<>();
UnifyType exx = new ExtendsType(xx);
alr.add(exx);
right = new ExtendsType(new ReferenceType("Vector", new TypeParams(alr)));
*/
/*
List<UnifyType> al = new ArrayList<>();
PlaceholderType xx =new PlaceholderType("xx");
al.add(xx);
left = new ExtendsType(xx);
right = xx;
*/
/*
List<UnifyType> al = new ArrayList<>();
PlaceholderType xx =new PlaceholderType("xx");
PlaceholderType yy =new PlaceholderType("yy");
al.add(xx);
left = yy;
right = new ExtendsType(xx);
*/
//Die Faelle abfangen, bei den Variablen verglichen werden PL 2018-12-11
UnifyType ex;
if (left instanceof PlaceholderType) {
if ((right instanceof WildcardType)
&& ((ex = ((WildcardType)right).wildcardedType) instanceof PlaceholderType)
&& ((PlaceholderType)left).getName().equals(((PlaceholderType)ex).getName())) {// a <.? ? extends a oder a <.? ? super a
return -1;
}
else {
return 0;
}
}
if (right instanceof PlaceholderType) {//&& (left instanceof WildcardType)) {PL geloescht 2019-01-15 analog zu oben
if ((left instanceof WildcardType) //PL eingefuegt 2019-01-15 analog zu oben
&& ((ex = ((WildcardType)left).wildcardedType) instanceof PlaceholderType)
&& ((PlaceholderType)right).getName().equals(((PlaceholderType)ex).getName())) {// ? extends a <. a oder ? super a <. a
return 1;
}
else {
return 0;
}
}
UnifyPair up = new UnifyPair(left, right, pairop);
TypeUnifyTask unifyTask = new TypeUnifyTask();
HashSet<UnifyPair> hs = new HashSet<>();
hs.add(up);
Set<UnifyPair> smallerRes = unifyTask.applyTypeUnificationRules(hs, this);
/*
//if (left.getName().equals("Matrix") || right.getName().equals("Matrix"))
{try {
logFile.write("\nsmallerRes: " + smallerRes);//"smallerHash: " + greaterHash.toString());
logFile.flush();
}
catch (IOException e) {
System.err.println("no LogFile");}}
*/
//Gleichungen der Form a <./=. Theta oder Theta <./=. a oder a <./=. b sind ok.
Predicate<UnifyPair> delFun = x -> !((x.getLhsType() instanceof PlaceholderType ||
x.getRhsType() instanceof PlaceholderType)
&& !((x.getLhsType() instanceof WildcardType) && //? extends/super a <.? a
((WildcardType)x.getLhsType()).getWildcardedType().equals(x.getRhsType()))
);
long smallerLen = smallerRes.stream().filter(delFun).count();
if (smallerLen == 0) return -1;
else {
up = new UnifyPair(right, left, pairop);
//TypeUnifyTask unifyTask = new TypeUnifyTask();
hs = new HashSet<>();
hs.add(up);
Set<UnifyPair> greaterRes = unifyTask.applyTypeUnificationRules(hs, this);
/*
//if (left.getName().equals("Matrix") || right.getName().equals("Matrix"))
{try {
logFile.write("\ngreaterRes: " + greaterRes);//"smallerHash: " + greaterHash.toString());
logFile.flush();
}
catch (IOException e) {
System.err.println("no LogFile");}}
*/
//Gleichungen der Form a <./=. Theta oder Theta <./=. a oder a <./=. b sind ok.
long greaterLen = greaterRes.stream().filter(delFun).count();
if (greaterLen == 0) return 1;
else {
//try {logFile.write("0 left: "+ left + " right: " + right + " pairop: " + pairop);} catch (IOException ie) {}
return 0;
}
}
}
}
@@ -0,0 +1,103 @@
package de.dhbwstuttgart.typeinference.unify.model;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Set;
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
import de.dhbwstuttgart.typeinference.unify.interfaces.UnifyTypeVisitor;
/**
* A real function type in java.
* @author Florian Steurer
*/
public class FunNType extends UnifyType {
public <T> UnifyType accept(UnifyTypeVisitor<T> visitor, T ht) {
return visitor.visit(this, ht);
}
/**
* Creates a FunN-Type with the specified TypeParameters.
*/
protected FunNType(TypeParams p) {
super("Fun"+(p.size()-1)+"$$", p);
}
/**
* Creates a new FunNType.
* @param tp The parameters of the type.
* @return A FunNType.
* @throws IllegalArgumentException is thrown when there are to few type parameters or there are wildcard-types.
*/
public static FunNType getFunNType(TypeParams tp) throws IllegalArgumentException {
if(tp.size() == 0)
throw new IllegalArgumentException("FunNTypes need at least one type parameter");
for(UnifyType t : tp)
if(t instanceof WildcardType)
throw new IllegalArgumentException("Invalid TypeParams for a FunNType: " + tp);
return new FunNType(tp);
}
/**
* Returns the degree of the function type, e.g. 2 for FunN<Integer, Integer, Integer>.
*/
public int getN() {
return typeParams.size()-1;
}
@Override
public UnifyType setTypeParams(TypeParams newTp) {
if(newTp.hashCode() == typeParams.hashCode() && newTp.equals(typeParams))
return this;
return getFunNType(newTp);
}
@Override
Set<UnifyType> smArg(IFiniteClosure fc, Set<UnifyType> fBounded) {
return fc.smArg(this, fBounded);
}
@Override
Set<UnifyType> grArg(IFiniteClosure fc, Set<UnifyType> fBounded) {
return fc.grArg(this, fBounded);
}
@Override
UnifyType apply(Unifier unif) {
// TODO this bypasses the validation of the type parameters.
// Wildcard types can be unified into FunNTypes.
TypeParams newParams = typeParams.apply(unif);
if(newParams.hashCode() == typeParams.hashCode() && newParams.equals(typeParams))
return this;
return new FunNType(newParams);
}
@Override
public Boolean wrongWildcard() {
return (new ArrayList<UnifyType>(Arrays.asList(getTypeParams()
.get())).stream().filter(x -> (x instanceof WildcardType)).findFirst().isPresent());
}
@Override
public int hashCode() {
return 181 + typeParams.hashCode();
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof FunNType))
return false;
if(obj.hashCode() != this.hashCode())
return false;
FunNType other = (FunNType) obj;
return other.getTypeParams().equals(typeParams);
}
}
@@ -0,0 +1,118 @@
package de.dhbwstuttgart.typeinference.unify.model;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
/**
* A node of a directed graph.
* @author Florian Steurer
*
* @param <T> The type of the content of the node.
*/
class Node<T> {
/**
* The content of the node.
*/
private T content;
/**
* The set of predecessors
*/
private HashSet<Node<T>> predecessors = new HashSet<>();
/**
* The set of descendants
*/
private HashSet<Node<T>> descendants = new HashSet<>();
/**
* Creates a node containing the specified content.
*/
public Node(T content) {
this.content = content;
}
/**
* Adds a directed edge from this node to the descendant (this -> descendant)
*/
public void addDescendant(Node<T> descendant) {
if(descendants.contains(descendant))
return;
descendants.add(descendant);
descendant.addPredecessor(this);
}
/**
* Adds some directed edges from this node to the descendant (this -> descendant)
*/
public void addAllDescendant(Set<Node<T>> allDescendants) {
for(Node<T> descendant: allDescendants) {
addDescendant(descendant);
}
}
/**
* Adds a directed edge from the predecessor to this node (predecessor -> this)
*/
public void addPredecessor(Node<T> predecessor) {
if(predecessors.contains(predecessor))
return;
predecessors.add(predecessor);
predecessor.addDescendant(this);
}
/**
* Adds some directed edges from the predecessor to this node (predecessor -> this)
*/
public void addAllPredecessor(Set<Node<T>> allPredecessors) {
for(Node<T> predecessor: allPredecessors) {
addPredecessor(predecessor);
}
}
/**
* The content of this node.
*/
public T getContent() {
return content;
}
/**
* Returns all predecessors (nodes that have a directed edge to this node)
*/
public Set<Node<T>> getPredecessors() {
return predecessors;
}
/**
* Returns all descendants. All nodes M, where there is a edge from this node to the node M.
* @return
*/
public Set<Node<T>> getDescendants() {
return descendants;
}
/**
* Retrieves the content of all descendants.
*/
public Set<T> getContentOfDescendants() {
return descendants.stream().map(x -> x.getContent()).collect(Collectors.toSet());
}
/**
* Retrieves the content of all predecessors.
*/
public Set<T> getContentOfPredecessors() {
return predecessors.stream().map(x -> x.getContent()).collect(Collectors.toSet());
}
@Override
public String toString() {
return "Elem: Node(" + content.toString() + ")\nPrec: " + getContentOfPredecessors().toString()
+ "\nDesc: " + getContentOfDescendants().toString() + "\n\n";
}
}
@@ -0,0 +1,89 @@
package de.dhbwstuttgart.typeinference.unify.model;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public abstract class OrderingExtend<T> extends com.google.common.collect.Ordering<T> {
public List<T> maxElements(Iterable<T> iterable) {
ArrayList<T> ret = new ArrayList<>();
while (iterable.iterator().hasNext()) {
Set<T> believe = new HashSet<>();
T max = max(iterable);
ret.add(max);
Iterator<T> it = iterable.iterator();
while (it.hasNext()) {
T elem = it.next();
if (!(compare(max, elem) == 1) && !max.equals(elem)) {
believe.add(elem);
}
}
iterable = believe;
}
return ret;
}
public List<T> minElements(Iterable<T> iterable) {
ArrayList<T> ret = new ArrayList<>();
while (iterable.iterator().hasNext()) {
Set<T> believe = new HashSet<>();
T min = min(iterable);
ret.add(min);
Iterator<T> it = iterable.iterator();
while (it.hasNext()) {
T elem = it.next();
if (!(compare(min, elem) == -1) && !min.equals(elem)) {
believe.add(elem);
}
}
iterable = believe;
}
return ret;
}
public List<T> smallerEqThan(T elem, Iterable<T> iterable) {
List<T> ret = smallerThan(elem, iterable);
ret.add(elem);
return ret;
}
public List<T> smallerThan(T elem, Iterable<T> iterable) {
ArrayList<T> ret = new ArrayList<>();
Iterator<T> it = iterable.iterator();
while (it.hasNext()) {
T itElem = it.next();
if (!itElem.equals(elem) && compare(elem, itElem) == 1) {
ret.add(itElem);
}
}
return ret;
}
public List<T> greaterEqThan(T elem, Iterable<T> iterable) {
List<T> ret = greaterThan(elem, iterable);
ret.add(elem);
return ret;
}
public List<T> greaterThan(T elem, Iterable<T> iterable) {
ArrayList<T> ret = new ArrayList<>();
Iterator<T> it = iterable.iterator();
while (it.hasNext()) {
T itElem = it.next();
if (!itElem.equals(elem) && (compare(elem, itElem) == -1)) {
ret.add(itElem);
}
}
return ret;
}
}
@@ -0,0 +1,457 @@
package de.dhbwstuttgart.typeinference.unify.model;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.google.common.collect.Ordering;
import de.dhbwstuttgart.typeinference.unify.Match;
import de.dhbwstuttgart.typeinference.unify.TypeUnifyTask;
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
import de.dhbwstuttgart.util.Pair;
public class OrderingUnifyPair extends OrderingExtend<Set<UnifyPair>> {
protected IFiniteClosure fc;
public OrderingUnifyPair(IFiniteClosure fc) {
this.fc = fc;
}
/*
* vergleicht Paare (a =. Theta) und (a =. Theta')
* in dem compare(Theta, Theta') aufgerufen wird.
*/
public int compareEq (UnifyPair left, UnifyPair right) {
try {
//if (left.getRhsType() instanceof WildcardType || right.getRhsType() instanceof WildcardType) {//PL 2019-01-12 ausgetauscht
if (((PlaceholderType)left.getLhsType()).isInnerType() && ((PlaceholderType)right.getLhsType()).isInnerType()) {
return fc.compare(left.getRhsType(), right.getRhsType(), PairOperator.SMALLERDOTWC);
}
else {
return fc.compare(left.getRhsType(), right.getRhsType(), PairOperator.SMALLERDOT);
}}
catch (ClassCastException e) {
try {
((FiniteClosure)fc).logFile.write("ClassCastException: " + left.toString() + " " + left.getGroundBasePair() + "\n\n");
((FiniteClosure)fc).logFile.flush();
}
catch (IOException ie) {
}
return -99;
}
}
/*
public int compareEq (UnifyPair left, UnifyPair right) {
if (left == null || right == null)
System.out.println("Fehler");
if (left.getLhsType() instanceof PlaceholderType) {
return fc.compare(left.getRhsType(), right.getRhsType(), left.getPairOp());
}
else {
return fc.compare(left.getLhsType(), right.getLhsType(), left.getPairOp());
}
}
*/
public Pair<Integer,Set<UnifyPair>> compare (UnifyType left, UnifyType right) {
UnifyPair up;
if (left instanceof WildcardType || right instanceof WildcardType) {
up = new UnifyPair(left, right, PairOperator.SMALLERDOTWC);
if (((left instanceof ExtendsType)
&& (((ExtendsType)left).getExtendedType().getName().equals("java.util.Vector"))
&& (((ReferenceType)((ExtendsType)left).getExtendedType()).getTypeParams().iterator().next() instanceof ExtendsType)) ||
((right instanceof ExtendsType)
&& (((ExtendsType)right).getExtendedType().getName().equals("java.util.Vector"))
&& (((ReferenceType)((ExtendsType)right).getExtendedType()).getTypeParams().iterator().next() instanceof ExtendsType)))
{
System.out.println("");
}
if (((right instanceof SuperType) && (((SuperType)right).getSuperedType().getName().equals("java.lang.Object")))
||((left instanceof SuperType) && (((SuperType)left).getSuperedType().getName().equals("java.lang.Object"))))
{
System.out.println("");
}
}
else {
up = new UnifyPair(left, right, PairOperator.SMALLERDOT);
}
TypeUnifyTask unifyTask = new TypeUnifyTask();
HashSet<UnifyPair> hs = new HashSet<>();
hs.add(up);
Set<UnifyPair> smallerRes = unifyTask.applyTypeUnificationRules(hs, fc);
long smallerLen = smallerRes.stream().filter(x -> !(x.getLhsType() instanceof PlaceholderType && x.getRhsType() instanceof PlaceholderType)).count();
if (smallerLen == 0) return new Pair<>(-1, smallerRes);
else {
if (left instanceof WildcardType || right instanceof WildcardType) {
up = new UnifyPair(right, left, PairOperator.SMALLERDOTWC);
if (((left instanceof ExtendsType)
&& (((ExtendsType)left).getExtendedType().getName().equals("java.util.Vector"))
&& (((ReferenceType)((ExtendsType)left).getExtendedType()).getTypeParams().iterator().next() instanceof ExtendsType)) ||
((right instanceof ExtendsType)
&& (((ExtendsType)right).getExtendedType().getName().equals("java.util.Vector"))
&& (((ReferenceType)((ExtendsType)right).getExtendedType()).getTypeParams().iterator().next() instanceof ExtendsType)))
{
System.out.println("");
}
if (right instanceof SuperType)
{
System.out.println("");
}
}
else {
up = new UnifyPair(right, left, PairOperator.SMALLERDOT);
}
//TypeUnifyTask unifyTask = new TypeUnifyTask();
hs = new HashSet<>();
hs.add(up);
Set<UnifyPair> greaterRes = unifyTask.applyTypeUnificationRules(hs, fc);
long greaterLen = greaterRes.stream().filter(x -> !(x.getLhsType() instanceof PlaceholderType && x.getRhsType() instanceof PlaceholderType)).count();
if (greaterLen == 0) return new Pair<>(1, greaterRes);
else return new Pair<>(0, new HashSet<>());
}
}
/* TODO muss noch verifiziert werden PL 2018-03-21
* (non-Javadoc)
* fuehrt zu Fehlern bei Arrays.sort (contract nicht erfuellt)
* @see com.google.common.collect.Ordering#compare(java.lang.Object, java.lang.Object)
*/
public int compare (Set<UnifyPair> leftpara, Set<UnifyPair> rightpara) {
Set<UnifyPair> left = new HashSet<>(leftpara);
Set<UnifyPair> right = new HashSet<>(rightpara);
/*
//pairop = PairOperator.SMALLERDOTWC;
List<UnifyType> al = new ArrayList<>();
PlaceholderType xx = PlaceholderType.freshPlaceholder();
al.add(xx);
UnifyType t1 = new ExtendsType(new ReferenceType("Vector", new TypeParams(al)));
//PlaceholderType yy =new PlaceholderType("yy");
List<UnifyType> alr = new ArrayList<>();
UnifyType exx = new ExtendsType(xx);
alr.add(exx);
UnifyType t2 = new ExtendsType(new ReferenceType("Vector", new TypeParams(alr)));
PlaceholderType a = PlaceholderType.freshPlaceholder();
a.setInnerType(true);
UnifyPair p1 = new UnifyPair(a, t1, PairOperator.SMALLERDOTWC);
PlaceholderType b = PlaceholderType.freshPlaceholder();
b.setInnerType(true);
UnifyPair p2 = new UnifyPair(b, t2, PairOperator.SMALLERDOTWC);
List<UnifyType> al3 = new ArrayList<>();
al3.add(a);
List<UnifyType> al4 = new ArrayList<>();
al4.add(b);
UnifyPair p3 = new UnifyPair(new PlaceholderType("c"), new ReferenceType("Vector", new TypeParams(al3)), PairOperator.EQUALSDOT);
UnifyPair p4 = new UnifyPair(new PlaceholderType("c"), new ReferenceType("Vector", new TypeParams(al4)), PairOperator.EQUALSDOT);
right = new HashSet<>();
right.add(p1);
right.add(p3);
left = new HashSet<>();
left.add(p2);
left.add(p4);
*/
Set<UnifyPair> lefteq = left.stream()
.filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.EQUALSDOT))
.collect(Collectors.toCollection(HashSet::new));
Set<UnifyPair> righteq = right.stream()
.filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.EQUALSDOT))
.collect(Collectors.toCollection(HashSet::new));
Set<UnifyPair> leftle = left.stream()
.filter(x -> ((x.getLhsType() instanceof PlaceholderType || x.getRhsType() instanceof PlaceholderType)
&& x.getPairOp() == PairOperator.SMALLERDOT))
.collect(Collectors.toCollection(HashSet::new));
Set<UnifyPair> rightle = right.stream()
.filter(x -> ((x.getLhsType() instanceof PlaceholderType || x.getRhsType() instanceof PlaceholderType)
&& x.getPairOp() == PairOperator.SMALLERDOT))
.collect(Collectors.toCollection(HashSet::new));
Set<UnifyPair> leftlewc = left.stream()
.filter(x -> ((x.getLhsType() instanceof PlaceholderType || x.getRhsType() instanceof PlaceholderType)
&& x.getPairOp() == PairOperator.SMALLERDOTWC))
.collect(Collectors.toCollection(HashSet::new));
Set<UnifyPair> rightlewc = right.stream()
.filter(x -> ((x.getLhsType() instanceof PlaceholderType || x.getRhsType() instanceof PlaceholderType)
&& x.getPairOp() == PairOperator.SMALLERDOTWC))
.collect(Collectors.toCollection(HashSet::new));
//System.out.println(left.toString());
//Fall 2
//if (lefteq.iterator().next().getLhsType().getName().equals("AJO")) {
// System.out.print("");
//}
//ODER-CONSTRAINT
Set<UnifyPair> leftBase = left.stream().map(x -> x.getGroundBasePair()).collect(Collectors.toCollection(HashSet::new));
Set<UnifyPair> rightBase = right.stream().map(x -> x.getGroundBasePair()).collect(Collectors.toCollection(HashSet::new));
Set<UnifyPair> lefteqOder = left.stream()
.filter(x -> { UnifyPair y = x.getGroundBasePair();
/*try {
((FiniteClosure)fc).logFile.write("leftBase: " + leftBase.toString() +"\n");
((FiniteClosure)fc).logFile.write("rightBase: " + rightBase.toString() +"\n\n");
((FiniteClosure)fc).logFile.write("left: " + left.toString() +"\n");
((FiniteClosure)fc).logFile.write("right: " + right.toString() +"\n\n");
((FiniteClosure)fc).logFile.write("y: " + y.toString() +"\n");
((FiniteClosure)fc).logFile.write("y.getLhsType() : " + y.getLhsType() .toString() +"\n\n");
((FiniteClosure)fc).logFile.write("y.getRhsType(): " + y.getRhsType().toString() +"\n");
((FiniteClosure)fc).logFile.write("x.getPairOp(): " + x.getPairOp().toString() +"\n\n");
}
catch (IOException ie) {
} */
return (y.getLhsType() instanceof PlaceholderType &&
!(y.getRhsType() instanceof PlaceholderType) &&
x.getPairOp() == PairOperator.EQUALSDOT);})
.collect(Collectors.toCollection(HashSet::new));
left.removeAll(lefteqOder);
Set<UnifyPair> righteqOder = right.stream()
.filter(x -> { UnifyPair y = x.getGroundBasePair();
return (y.getLhsType() instanceof PlaceholderType &&
!(y.getRhsType() instanceof PlaceholderType) &&
x.getPairOp() == PairOperator.EQUALSDOT);})
.collect(Collectors.toCollection(HashSet::new));
right.removeAll(righteqOder);
Set<UnifyPair> lefteqRet = left.stream()
.filter(x -> { UnifyPair y = x.getGroundBasePair();
return (y.getRhsType() instanceof PlaceholderType &&
((PlaceholderType)y.getRhsType()).getOrCons() == (byte)-1);})
.collect(Collectors.toCollection(HashSet::new));
left.removeAll(lefteqRet);
Set<UnifyPair> righteqRet = right.stream()
.filter(x -> { UnifyPair y = x.getGroundBasePair();
return (y.getRhsType() instanceof PlaceholderType &&
((PlaceholderType)y.getRhsType()).getOrCons() == (byte)-1);})
.collect(Collectors.toCollection(HashSet::new));
right.removeAll(righteqRet);
Set<UnifyPair> leftleOder = left.stream()
.filter(x -> (x.getPairOp() == PairOperator.SMALLERDOT))
.collect(Collectors.toCollection(HashSet::new));
Set<UnifyPair> rightleOder = right.stream()
.filter(x -> (x.getPairOp() == PairOperator.SMALLERDOT))
.collect(Collectors.toCollection(HashSet::new));
/*
synchronized(this) {
try {
((FiniteClosure)fc).logFile.write("leftBase: " + leftBase.toString() +"\n");
((FiniteClosure)fc).logFile.write("rightBase: " + rightBase.toString() +"\n\n");
((FiniteClosure)fc).logFile.write("left: " + left.toString() +"\n");
((FiniteClosure)fc).logFile.write("right: " + right.toString() +"\n\n");
((FiniteClosure)fc).logFile.write("lefteqOder: " + lefteqOder.toString() +"\n");
((FiniteClosure)fc).logFile.write("righteqOder: " + righteqOder.toString() +"\n\n");
((FiniteClosure)fc).logFile.write("lefteqRet: " + lefteqRet.toString() +"\n");
((FiniteClosure)fc).logFile.write("righteqRet: " + righteqRet.toString() +"\n\n");
((FiniteClosure)fc).logFile.write("leftleOder: " + leftleOder.toString() +"\n");
((FiniteClosure)fc).logFile.write("rightleOder: " + rightleOder.toString() +"\n\n");
((FiniteClosure)fc).logFile.flush();
}
catch (IOException ie) {
}
}
*/
Integer compareEq;
if (lefteqOder.size() == 1 && righteqOder.size() == 1 && lefteqRet.size() == 1 && righteqRet.size() == 1) {
Match m = new Match();
if ((compareEq = compareEq(lefteqOder.iterator().next().getGroundBasePair(), righteqOder.iterator().next().getGroundBasePair())) == -1) {
ArrayList<UnifyPair> matchList =
rightleOder.stream().map(x -> {
UnifyPair leftElem = leftleOder.stream()
.filter(y -> y.getGroundBasePair().getLhsType().equals(x.getGroundBasePair().getLhsType()))
.findAny().get();
return new UnifyPair(x.getRhsType(), leftElem.getRhsType(), PairOperator.EQUALSDOT);})
.collect(Collectors.toCollection(ArrayList::new));
if (m.match(matchList).isPresent()) {
//try { ((FiniteClosure)fc).logFile.write("result1: -1 \n\n"); } catch (IOException ie) {}
return -1;
}
else {
//try { ((FiniteClosure)fc).logFile.write("result1: 0 \n\n"); } catch (IOException ie) {}
return 0;
}
} else if (compareEq == 1) {
ArrayList<UnifyPair> matchList =
leftleOder.stream().map(x -> {
UnifyPair rightElem = rightleOder.stream()
.filter(y ->
y.getGroundBasePair().getLhsType().equals(x.getGroundBasePair().getLhsType()))
.findAny().get();
return new UnifyPair(x.getRhsType(), rightElem.getRhsType(), PairOperator.EQUALSDOT);})
.collect(Collectors.toCollection(ArrayList::new));
if (m.match(matchList).isPresent()) {
//try { ((FiniteClosure)fc).logFile.write("result2: 1 \n\n"); } catch (IOException ie) {}
return 1;
}
else {
//try { ((FiniteClosure)fc).logFile.write("result2: 0 \n\n"); } catch (IOException ie) {}
return 0;
}
} else {
/*
synchronized(this) {
try {
((FiniteClosure)fc).logFile.write("leftBase: " + leftBase.toString() +"\n");
((FiniteClosure)fc).logFile.write("rightBase: " + rightBase.toString() +"\n\n");
((FiniteClosure)fc).logFile.write("left: " + left.toString() +"\n");
((FiniteClosure)fc).logFile.write("right: " + right.toString() +"\n\n");
((FiniteClosure)fc).logFile.write("lefteqOder: " + lefteqOder.toString() +"\n");
((FiniteClosure)fc).logFile.write("righteqOder: " + righteqOder.toString() +"\n\n");
((FiniteClosure)fc).logFile.write("lefteqRet: " + lefteqRet.toString() +"\n");
((FiniteClosure)fc).logFile.write("righteqRet: " + righteqRet.toString() +"\n\n");
((FiniteClosure)fc).logFile.write("leftleOder: " + leftleOder.toString() +"\n");
((FiniteClosure)fc).logFile.write("rightleOder: " + rightleOder.toString() +"\n\n");
((FiniteClosure)fc).logFile.write("result3: 0 \n\n");
((FiniteClosure)fc).logFile.flush();
}
catch (IOException ie) {
}
}
*/
return 0;
}
}
if (lefteq.size() == 1 && lefteq.iterator().next().getRhsType() instanceof ExtendsType && leftle.size() == 1 && righteq.size() == 0 && rightle.size() == 1) {
return 1;
}
//Fall 2
if (lefteq.size() == 0 && leftle.size() == 1 && righteq.size() == 1 && righteq.iterator().next().getRhsType() instanceof ExtendsType && rightle.size() == 1) {
return -1;
}
//Fall 3
if (lefteq.size() == 1 && lefteq.iterator().next().getRhsType() instanceof SuperType && leftle.size() == 1 && righteq.size() == 0 && rightle.size() == 1) {
return -1;
}
//Fall 3
if (lefteq.size() == 0 && leftle.size() == 1 && righteq.size() == 1 && righteq.iterator().next().getRhsType() instanceof SuperType && rightle.size() == 1) {
return 1;
}
//Fall 5
if (lefteq.size() == 1 && leftle.size() == 0 && righteq.size() == 1 && rightle.size() == 1) {
return -1;
}
//Fall 5
if (lefteq.size() == 1 && leftle.size() == 1 && righteq.size() == 1 && rightle.size() == 0) {
return 1;
}
//Fall 5
if (lefteq.size() == 1 && leftle.size() == 1 && righteq.size() == 1 && rightle.size() == 1) {
return 0;
}
// Nur Paare a =. Theta
if (leftle.size() == 0 && rightle.size() == 0 && leftlewc.size() == 0 && rightlewc.size() ==0) {
Stream<UnifyPair> lseq = lefteq.stream(); //left.filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.EQUALSDOT));
Stream<UnifyPair> rseq = righteq.stream(); //right.filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.EQUALSDOT));
BinaryOperator<HashMap<UnifyType,UnifyPair>> combiner = (x,y) -> { x.putAll(y); return x;};
HashMap<UnifyType,UnifyPair> hm = rseq.reduce(new HashMap<UnifyType,UnifyPair>(), (x, y)-> { x.put(y.getLhsType(),y); return x; }, combiner);
lseq = lseq.filter(x -> !(hm.get(x.getLhsType()) == null));//NOCHMALS UEBERPRUEFEN!!!!
lseq = lseq.filter(x -> !x.equals(hm.get(x.getLhsType()))); //Elemente die gleich sind muessen nicht verglichen werden
Optional<Integer> si = lseq.map(x -> compareEq(x, hm.get(x.getLhsType()))).reduce((x,y)-> { if (x == y) return x; else return 0; } );
if (!si.isPresent()) return 0;
else return si.get();
}
//Fall 1 und 4
if (lefteq.size() >= 1 && righteq.size() >= 1 && (leftlewc.size() > 0 || rightlewc.size() > 0)) {
if (lefteq.iterator().next().getLhsType().getName().equals("D"))
System.out.print("");
//Set<PlaceholderType> varsleft = lefteq.stream().map(x -> (PlaceholderType)x.getLhsType()).collect(Collectors.toCollection(HashSet::new));
//Set<PlaceholderType> varsright = righteq.stream().map(x -> (PlaceholderType)x.getLhsType()).collect(Collectors.toCollection(HashSet::new));
//filtern des Paares a = Theta, das durch a <. Thata' generiert wurde (nur im Fall 1 relevant) andere Substitutioen werden rausgefiltert
lefteq.removeIf(x -> (x.getBasePair()!=null) && !(x.getLhsType().getName().equals(x.getBasePair().getLhsType().getName())
||x.getLhsType().getName().equals(x.getBasePair().getRhsType().getName())));//removeIf(x -> !varsright.contains(x.getLhsType()));
righteq.removeIf(x -> (x.getBasePair()!=null) && !(x.getLhsType().getName().equals(x.getBasePair().getLhsType().getName())
||x.getLhsType().getName().equals(x.getBasePair().getRhsType().getName())));//.removeIf(x -> !varsleft.contains(x.getLhsType()));
UnifyPair lseq = lefteq.iterator().next();
UnifyPair rseq = righteq.iterator().next();
if (lseq.getRhsType().getName().equals("Object")) {
if (rseq.getRhsType().getName().equals("Object")) return 0;
else return 1;
}
else {
if (rseq.getRhsType().getName().equals("Object")) return -1;
}
if (leftlewc.size() == rightlewc.size()) {
//TODO: Hier wird bei Wildcards nicht das richtige compare aufgerufen PL 18-04-20
Pair<Integer, Set<UnifyPair>> int_Unifier = compare(lseq.getRhsType(), rseq.getRhsType());
Unifier uni = new Unifier();
int_Unifier.getValue().get().forEach(x -> uni.add((PlaceholderType) x.getLhsType(), x.getRhsType()));
if (!lseq.getRhsType().getName().equals(rseq.getRhsType().getName())
|| leftlewc.size() == 0 || rightlewc.size() == 0) return int_Unifier.getKey();
else {
Set <UnifyPair> lsleuni = leftlewc.stream().map(x -> uni.apply(x)).collect(Collectors.toCollection(HashSet::new));
Set <UnifyPair> rsleuni = rightlewc.stream().map(x -> uni.apply(x)).collect(Collectors.toCollection(HashSet::new));
BinaryOperator<HashMap<UnifyType,UnifyPair>> combiner = (x,y) -> { x.putAll(y); return x;};
HashMap<UnifyType,UnifyPair> hm;
Optional<Integer> si;
//1. Fall
if (leftlewc.iterator().next().getLhsType() instanceof PlaceholderType) {
hm = rsleuni.stream().reduce(new HashMap<UnifyType,UnifyPair>(), (x, y)-> { x.put(y.getLhsType(),y); return x; }, combiner);
Stream<UnifyPair> lslewcstr = lsleuni.stream().filter(x -> !(hm.get(x.getLhsType()) == null));
si = lslewcstr.map(x -> fc.compare(x.getRhsType(), hm.get(x.getLhsType()).getRhsType(), PairOperator.SMALLERDOTWC)).reduce((x,y)-> { if (x == y) return x; else return 0; } );
}
//4. Fall
else {
hm = rsleuni.stream().reduce(new HashMap<UnifyType,UnifyPair>(), (x, y)-> { x.put(y.getRhsType(),y); return x; }, combiner);
Stream<UnifyPair> lslewcstr = lsleuni.stream().filter(x -> !(hm.get(x.getRhsType()) == null));
si = lslewcstr.map(x -> fc.compare(x.getLhsType(), hm.get(x.getRhsType()).getLhsType(), PairOperator.SMALLERDOTWC)).reduce((x,y)-> { if (x == y) return x; else return 0; } );
}
if (!si.isPresent()) return 0;
else return si.get();
}
} else {
if (leftlewc.size() > 0) {
Set<UnifyPair> subst;
subst = leftlewc.stream().map(x -> {
if (x.getLhsType() instanceof PlaceholderType) {
return new UnifyPair(x.getLhsType(), x.getRhsType(), PairOperator.EQUALSDOT);
}
else {
return new UnifyPair(x.getRhsType(), x.getLhsType(), PairOperator.EQUALSDOT);
}}).collect(Collectors.toCollection(HashSet::new));
Unifier uni = new Unifier();
lseq = uni.apply(lseq);
}
else {
Set<UnifyPair> subst;
subst = rightlewc.stream().map(x -> {
if (x.getLhsType() instanceof PlaceholderType) {
return new UnifyPair(x.getLhsType(), x.getRhsType(), PairOperator.EQUALSDOT);
}
else {
return new UnifyPair(x.getRhsType(), x.getLhsType(), PairOperator.EQUALSDOT);
}}).collect(Collectors.toCollection(HashSet::new));
Unifier uni = new Unifier();
subst.stream().forEach(x -> uni.add((PlaceholderType) x.getLhsType(), x.getRhsType()));
rseq = uni.apply(rseq);
}
return compareEq(lseq, rseq);
}
}
return 0;
}
}
@@ -0,0 +1,49 @@
package de.dhbwstuttgart.typeinference.unify.model;
/**
* Operators of pairs of the unification.
* @author Florian Steurer
*/
public enum PairOperator {
/**
* The smaller operator (T < P) is used to express a subtyping relation between
* T and P for example in the finite closure. It is necessarily true.
*/
SMALLER,
/**
* The smallerdot operator (T <. P) is used to express a subtyping relation between
* of T and P in a CONSTRAINT during the unification. It is not necessarily true.
*/
SMALLERDOT,
/**
* The smallernedot operator for arguments (T <!=. P) is the same as SMALLERDOT without
* T == P. It is used for operations + / - / * / < / > / ... with the Supertype Number
*/
SMALLERNEQDOT,
/**
* The smallerdot operator for arguments (T <.? P) is used to express that
* T is an element of smArg(P) (or P is an element of grArg(T)) in a CONSTRAINT
* during the unification. It is not necessarily true.
*/
SMALLERDOTWC,
/**
* The equalsdot operator (T =. P) is used to express that two types during the unification
* should be equal. It is not necessarily true.
*/
EQUALSDOT;
@Override
public String toString() {
switch (this) {
case SMALLER: return "<";
case SMALLERDOT: return "<.";
case SMALLERNEQDOT: return "<!=.";
case SMALLERDOTWC: return "<.?";
default: return "=."; // EQUALSDOT
}
}
}
@@ -0,0 +1,208 @@
package de.dhbwstuttgart.typeinference.unify.model;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import de.dhbwstuttgart.typeinference.unify.distributeVariance;
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
import de.dhbwstuttgart.typeinference.unify.interfaces.UnifyTypeVisitor;
/**
* An unbounded placeholder type.
* @author Florian Steurer
*/
public final class PlaceholderType extends UnifyType{
/**
* Static list containing the names of all existing placeholders.
* Used for generating fresh placeholders.
*/
public static final Set<String> EXISTING_PLACEHOLDERS = ConcurrentHashMap.newKeySet();
/**
* Prefix of auto-generated placeholder names.
*/
protected static String nextName = "gen_";
/**
* Random number generator used to generate fresh placeholder name.
*/
protected static Random rnd = new Random(43558747548978L);
/**
* True if this object was auto-generated, false if this object was user-generated.
*/
private final boolean IsGenerated;
/**
* isWildcardable gibt an, ob ein Wildcardtyp dem PlaceholderType zugeordnet werden darf
*/
private boolean wildcardable = true;
/**
* is innerType gibt an, ob der Type des PlaceholderType innerhalb eines Typkonstruktorsverwendet wird
*/
private boolean innerType = false;
/**
* variance shows the variance of the pair
* -1: contravariant
* 1 covariant
* 0 invariant
* PL 2018-03-21
*/
private int variance = 0;
/*
* Fuer Oder-Constraints:
* orCons = 1: Receiver
* orCons = 0: Argument oder kein Oder-Constraint
* orCons = -1: RetType
*/
private byte orCons = 0;
/**
* Creates a new placeholder type with the specified name.
*/
public PlaceholderType(String name) {
super(name, new TypeParams());
EXISTING_PLACEHOLDERS.add(name); // Add to list of existing placeholder names
IsGenerated = false; // This type is user generated
}
/**
* Creates a new placeholdertype
* @param isGenerated true if this placeholder is auto-generated, false if it is user-generated.
*/
protected PlaceholderType(String name, boolean isGenerated) {
super(name, new TypeParams());
EXISTING_PLACEHOLDERS.add(name); // Add to list of existing placeholder names
IsGenerated = isGenerated;
}
public <T> UnifyType accept(UnifyTypeVisitor<T> visitor, T ht) {
return visitor.visit(this, ht);
}
/**
* Creates a fresh placeholder type with a name that does so far not exist.
* A user could later instantiate a type using the same name that is equivalent to this type.
* @return A fresh placeholder type.
*/
public static PlaceholderType freshPlaceholder() {
String name = nextName + (char) (rnd.nextInt(22) + 97); // Returns random char between 'a' and 'z'
// Add random chars while the name is in use.
while(EXISTING_PLACEHOLDERS.contains(name)) {
name += (char) (rnd.nextInt(22) + 97); // Returns random char between 'a' and 'z'
}
return new PlaceholderType(name, true);
}
/**
* True if this placeholder is auto-generated, false if it is user-generated.
*/
public boolean isGenerated() {
return IsGenerated;
}
public void setVariance(int v) {
variance = v;
}
public int getVariance() {
return variance;
}
public void reversVariance() {
if (variance == 1) {
setVariance(-1);
} else {
if (variance == -1) {
setVariance(1);
}}
}
public void setOrCons(byte i) {
orCons = i;
}
public byte getOrCons() {
return orCons;
}
public Boolean isWildcardable() {
return wildcardable;
}
public void disableWildcardtable() {
wildcardable = false;
}
public void enableWildcardtable() {
wildcardable = true;
}
public void setWildcardtable(Boolean wildcardable) {
this.wildcardable = wildcardable;
}
public Boolean isInnerType() {
return innerType;
}
public void setInnerType(Boolean innerType) {
this.innerType = innerType;
}
@Override
Set<UnifyType> smArg(IFiniteClosure fc, Set<UnifyType> fBounded) {
return fc.smArg(this, fBounded);
}
@Override
Set<UnifyType> grArg(IFiniteClosure fc, Set<UnifyType> fBounded) {
return fc.grArg(this, fBounded);
}
@Override
public UnifyType setTypeParams(TypeParams newTp) {
return this; // Placeholders never have params.
}
@Override
public int hashCode() {
return typeName.hashCode();
}
@Override
UnifyType apply(Unifier unif) {
if(unif.hasSubstitute(this)) {
UnifyType ret = unif.getSubstitute(this);
//PL 2018-05-17 Auskommentierung muesste korrekt sein,
//bereits in JavaTXComplier Variancen gesetzt werden.
//ret.accept(new distributeVariance(), this.getVariance());
return ret;
}
return this;
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof PlaceholderType))
return false;
return ((PlaceholderType) obj).getName().equals(typeName);
}
@Override
public Collection<PlaceholderType> getInvolvedPlaceholderTypes() {
ArrayList<PlaceholderType> ret = new ArrayList<>();
ret.add(this);
return ret;
}
}
@@ -0,0 +1,100 @@
package de.dhbwstuttgart.typeinference.unify.model;
import java.util.HashMap;
import java.util.Set;
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
import de.dhbwstuttgart.typeinference.unify.interfaces.UnifyTypeVisitor;
/**
* A reference type e.q. Integer or List<T>.
* @author Florian Steurer
*
*/
public class ReferenceType extends UnifyType {
/**
* The buffered hashCode
*/
private final int hashCode;
/**
* gibt an, ob der ReferenceType eine generische Typvariable ist
*/
private final boolean genericTypeVar;
public <T> UnifyType accept(UnifyTypeVisitor<T> visitor, T ht) {
return visitor.visit(this, ht);
}
public ReferenceType(String name, Boolean genericTypeVar) {
super(name, new TypeParams());
hashCode = 31 + 17 * typeName.hashCode() + 17 * typeParams.hashCode();
this.genericTypeVar = genericTypeVar;
}
public ReferenceType(String name, UnifyType... params) {
super(name, new TypeParams(params));
hashCode = 31 + 17 * typeName.hashCode() + 17 * typeParams.hashCode();
genericTypeVar = false;
}
public ReferenceType(String name, TypeParams params) {
super(name, params);
hashCode = 31 + 17 * typeName.hashCode() + 17 * typeParams.hashCode();
genericTypeVar = false;
}
public boolean isGenTypeVar () {
return genericTypeVar;
}
@Override
Set<UnifyType> smArg(IFiniteClosure fc, Set<UnifyType> fBounded) {
return fc.smArg(this, fBounded);
}
@Override
Set<UnifyType> grArg(IFiniteClosure fc, Set<UnifyType> fBounded) {
return fc.grArg(this, fBounded);
}
@Override
UnifyType apply(Unifier unif) {
TypeParams newParams = typeParams.apply(unif);
if(newParams.hashCode() == typeParams.hashCode() && newParams.equals(typeParams))
return this;
return new ReferenceType(typeName, newParams);
}
@Override
public UnifyType setTypeParams(TypeParams newTp) {
if(newTp.hashCode() == typeParams.hashCode() && newTp.equals(typeParams))
return this; // reduced the amount of objects created
return new ReferenceType(typeName, newTp);
}
@Override
public int hashCode() {
return hashCode;
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof ReferenceType))
return false;
if(obj.hashCode() != this.hashCode())
return false;
ReferenceType other = (ReferenceType) obj;
if(!other.getName().equals(typeName))
return false;
return other.getTypeParams().equals(typeParams);
}
}
@@ -0,0 +1,88 @@
package de.dhbwstuttgart.typeinference.unify.model;
import java.util.HashMap;
import java.util.Set;
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
import de.dhbwstuttgart.typeinference.unify.interfaces.UnifyTypeVisitor;
/**
* A super wildcard type e.g. ? super Integer.
* @author Florian Steurer
*/
public final class SuperType extends WildcardType {
public <T> UnifyType accept(UnifyTypeVisitor<T> visitor, T ht) {
return visitor.visit(this, ht);
}
/**
* Creates a new instance "? extends superedType"
* @param superedType The type that is supered e.g. Integer in "? super Integer"
*/
public SuperType(UnifyType superedType) {
super("? super " + superedType.getName(), superedType);
}
/**
* The type that is supered e.g. Integer in "? super Integer"
*/
public UnifyType getSuperedType() {
return wildcardedType;
}
@Override
public String toString() {
return "? super " + wildcardedType;
}
/**
* Sets the type parameters of the wildcarded type and returns a new supertype that supers that type.
*/
@Override
public UnifyType setTypeParams(TypeParams newTp) {
UnifyType newType = wildcardedType.setTypeParams(newTp);
if(newType == wildcardedType)
return this; // Reduced the amount of objects created
return new SuperType(wildcardedType.setTypeParams(newTp));
}
@Override
Set<UnifyType> smArg(IFiniteClosure fc, Set<UnifyType> fBounded) {
return fc.smArg(this, fBounded);
}
@Override
Set<UnifyType> grArg(IFiniteClosure fc, Set<UnifyType> fBounded) {
return fc.grArg(this, fBounded);
}
@Override
UnifyType apply(Unifier unif) {
UnifyType newType = wildcardedType.apply(unif);
if(newType.hashCode() == wildcardedType.hashCode() && newType.equals(wildcardedType))
return this; // Reduced the amount of objects created
return new SuperType(newType);
}
@Override
public int hashCode() {
/*
* It is important that the prime that is added is different to the prime added in hashCode() of ExtendsType.
* Otherwise ? extends T and ? super T have the same hashCode() for every Type T.
*/
return wildcardedType.hashCode() + 3917;
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof SuperType))
return false;
if(obj.hashCode() != this.hashCode())
return false;
SuperType other = (SuperType) obj;
return other.getSuperedType().equals(wildcardedType);
}
}
@@ -0,0 +1,191 @@
package de.dhbwstuttgart.typeinference.unify.model;
import java.util.*;
/**
* The generic or non-generic parameters of a type e.g. <T> for List<T>
* @author Florian Steurer
*/
public final class TypeParams implements Iterable<UnifyType>{
/**
* The array which backs the type parameters.
*/
private final UnifyType[] typeParams;
/**
* Hashcode calculation is expensive and must be cached.
*/
private final int hashCode;
/**
* Creates a new set of type parameters.
* @param types The type parameters.
*/
public TypeParams(List<UnifyType> types){
typeParams = new UnifyType[types.size()];
for(int i=0;i<types.size();i++){
typeParams[i] = types.get(i);
if(types.get(i)==null)throw new NullPointerException();
}
// Hashcode calculation is expensive and must be cached.
hashCode = Arrays.deepHashCode(typeParams);
}
/**
* Creates a new set of type parameters.
* @param types The type parameters.
*/
public TypeParams(UnifyType... types) {
typeParams = types;
// Hashcode calculation is expensive and must be cached.
hashCode = Arrays.deepHashCode(typeParams);
}
/**
* True if every parameter in this object is a placeholder type, false otherwise.
*/
public boolean arePlaceholders() {
return Arrays.stream(typeParams).allMatch(x -> x instanceof PlaceholderType);
}
/**
* Returns the number of the type parameters in this object.
* @return number of type parameters, always positive (including 0).
*/
public int size() {
return typeParams.length;
}
/**
* Returns true if this object has size() of zero, false otherwise.
*/
public boolean empty() {
return typeParams.length == 0;
}
/**
* Applies a unifier to every parameter in this object.
* @param unif The applied unifier.
* @return A new type parameter object, where the unifier was applied to every parameter.
*/
public TypeParams apply(Unifier unif) {
UnifyType[] newParams = new UnifyType[typeParams.length];
// If true, a type was modified and a new typeparams object has to be created.
// Otherwise it is enough to return this object, since it is immutable
// This reduced the needed TypeParams-Instances for the lambda14-Test from
// 130.000 to 30.000 without a decrease in speed.
boolean isNew = false;
for(int i = 0; i < typeParams.length; i++) {
UnifyType newType = typeParams[i].apply(unif);
newParams[i] = newType;
if(!isNew && (newType.hashCode() != typeParams[i].hashCode() || !newType.equals(typeParams[i])))
isNew = true;
}
if(!isNew)
return this;
return new TypeParams(newParams);
}
/**
* True if the PlaceholderType t is a parameter of this object, or if any parameter
* contains t (arbitrary depth of recursion), false otherwise.
*/
public boolean occurs(PlaceholderType t) {
for(UnifyType p : typeParams)
if(p instanceof PlaceholderType) {//PL 2018-01-31 dangeling else Problem { ... } eingefuegt.
if(p.equals(t))
return true;
}
else {
if(p.getTypeParams().occurs(t))
return true; }
return false;
}
/**
* Returns the i-th parameter of this object.
*/
public UnifyType get(int i) {
return typeParams[i];
}
/**
* Returns the parameters of this object.
* PL 2018-03-17
*/
public UnifyType[] get() {
return typeParams;
}
/**
* Sets the the type t as the i-th parameter and returns a new object
* that equals this object, except for the i-th type.
*/
public TypeParams set(UnifyType t, int idx) {
// Reduce the creation of new objects for less memory
// Reduced the needed instances of TypeParams in the lambda14-Test from
// 150.000 to 130.000
if(t.hashCode() == typeParams[idx].hashCode() && t.equals(typeParams[idx]))
return this;
UnifyType[] newparams = Arrays.copyOf(typeParams, typeParams.length);
newparams[idx] = t;
return new TypeParams(newparams);
}
@Override
public Iterator<UnifyType> iterator() {
return Arrays.stream(typeParams).iterator();
}
@Override
public int hashCode() {
return hashCode;
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof TypeParams))
return false;
if(obj.hashCode() != this.hashCode())
return false;
TypeParams other = (TypeParams) obj;
if(other.size() != this.size())
return false;
for(int i = 0; i < this.size(); i++){
//if(this.get(i) == null)
//System.out.print("s");
}
for(int i = 0; i < this.size(); i++)
if(!(this.get(i).equals(other.get(i))))
return false;
return true;
}
@Override
public String toString() {
String res = "";
for(UnifyType t : typeParams)
res += t + ",";
return "<" + res.substring(0, res.length()-1) + ">";
}
public Collection<? extends PlaceholderType> getInvolvedPlaceholderTypes() {
ArrayList<PlaceholderType> ret = new ArrayList<>();
for(UnifyType t : typeParams){
ret.addAll(t.getInvolvedPlaceholderTypes());
}
return ret;
}
}
@@ -0,0 +1,189 @@
package de.dhbwstuttgart.typeinference.unify.model;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
import java.util.function.Function;
/**
* A set of substitutions (s -> t) that is an applicable function to types and pairs.
* @author Florian Steurer
*/
public class Unifier implements Function<UnifyType, UnifyType>, Iterable<Entry<PlaceholderType, UnifyType>> {
/**
* The set of substitutions that unify a type-term
*/
private HashMap<PlaceholderType, UnifyType> substitutions = new HashMap<>();
/**
* Creates a new instance with a single substitution (source -> target).
* @param The type that is replaced
* @param The type that replaces
*/
public Unifier(PlaceholderType source, UnifyType target) {
substitutions.put(source, target);
}
/**
* Identity function as an "unifier".
*/
protected Unifier() {
}
/**
* Creates an unifier that is the identity function (thus has no substitutions).
*/
public static Unifier identity() {
return new Unifier();
}
/**
* Adds a substitution to the unifier from (source -> target)
* @param The type that is replaced
* @param The type that replaces
*/
public void add(PlaceholderType source, UnifyType target) {
Unifier tempU = new Unifier(source, target);
// Every new substitution must be applied to previously added substitutions
// otherwise the unifier needs to be applied multiple times to unify two terms
for(PlaceholderType pt : substitutions.keySet())
substitutions.put(pt, substitutions.get(pt).apply(tempU));
substitutions.put(source, target);
}
@Override
public UnifyType apply(UnifyType t) {
return t.apply(this);
}
/**
* Applies the unifier to the two terms of the pair.
* @return A new pair where the left and right-hand side are applied
*/
public UnifyPair apply(UnifyPair p) {
UnifyType newLhs = this.apply(p.getLhsType());
UnifyType newRhs = this.apply(p.getRhsType());
return new UnifyPair(newLhs, newRhs, p.getPairOp());
}
/**
* Applies the unifier to the two terms of the pair.
* works only for single subsitution
* @return A new pair where the left and right-hand side are applied
*/
public UnifyPair apply(UnifyPair thisAsPair, UnifyPair p) {
UnifyType newLhs = this.apply(p.getLhsType());
UnifyType newRhs = this.apply(p.getRhsType());
//Varianceweitergabe wird nicht benoetigt.
//PlaceholderType lhsph = (PlaceholderType)thisAsPair.getLhsType();
//if (lhsph.getVariance() != 0) {
// if (p.getLhsType().equals(lhsph)) {
// if (p.getRhsType() instanceof PlaceholderType) {
// ((PlaceholderType)p.getRhsType()).setVariance(lhsph.getVariance());
// }
// }
// if (p.getRhsType().equals(lhsph)) {
// if (p.getLhsType() instanceof PlaceholderType) {
// ((PlaceholderType)p.getLhsType()).setVariance(lhsph.getVariance());
// }
// }
//}
if (!(p.getLhsType().equals(newLhs)) || !(p.getRhsType().equals(newRhs))) {//Die Anwendung von this hat was veraendert PL 2018-04-01
Set<UnifyPair> suniUnifyPair = new HashSet<>();
suniUnifyPair.addAll(thisAsPair.getAllSubstitutions());
suniUnifyPair.add(thisAsPair);
if (p.getLhsType() instanceof PlaceholderType //&& newLhs instanceof PlaceholderType entfernt PL 2018-04-13
&& p.getPairOp() == PairOperator.EQUALSDOT) {
suniUnifyPair.add(p); //p koennte auch subsitution sein
}
return new UnifyPair(newLhs, newRhs, p.getPairOp(), suniUnifyPair, p);
}
return new UnifyPair(newLhs, newRhs, p.getPairOp(), p.getSubstitution(), p.getBasePair(), p.getfBounded());
}
/**
* Applies the unifier to the left terms of the pair.
* @return A new pair where the left and right-hand side are applied
*/
public UnifyPair applyleft(UnifyPair p) {
return new UnifyPair(this.apply(p.getLhsType()), p.getRhsType(), p.getPairOp());
}
/**
* True if the typevariable t will be substituted if the unifier is applied.
* false otherwise.
*/
public boolean hasSubstitute(PlaceholderType t) {
return substitutions.containsKey(t);
}
/**
* Returns the type that will replace the typevariable t if the unifier is applied.
*/
public UnifyType getSubstitute(PlaceholderType t) {
return substitutions.get(t);
}
/**
* The number of substitutions in the unifier. If zero, this is the identity function.
*/
public int size() {
return substitutions.size();
}
/**
* Garantuees that if there is a substitutions (a -> b) in this unifier,
* a is not an element of the targetParams. Substitutions that do not
* satisfy this condition, are swapped.
*/
public void swapPlaceholderSubstitutions(Iterable<UnifyType> targetParams) {
for(UnifyType tph : targetParams) {
if(!(tph instanceof PlaceholderType))
continue;
// Swap a substitutions (a -> b) if a is an element of the target params.
if(substitutions.containsKey(tph)) {
if((substitutions.get(tph) instanceof PlaceholderType)) {
PlaceholderType newLhs = (PlaceholderType) substitutions.get(tph);
substitutions.remove(tph);
substitutions.put(newLhs, tph);
}
}
}
}
public void swapPlaceholderSubstitutionsReverse(Iterable<UnifyType> sourceParams) {
for(UnifyType tph : sourceParams) {
if(!(tph instanceof PlaceholderType))
continue;
if(substitutions.containsValue(tph)) {
UnifyType key = substitutions.values().stream().filter(x -> x.equals(tph)).findAny().get();
if(key instanceof PlaceholderType) {
PlaceholderType newLhs = (PlaceholderType) tph;
substitutions.remove(key);
substitutions.put(newLhs, key);
}
}
}
}
@Override
public String toString() {
String result = "{ ";
for(Entry<PlaceholderType, UnifyType> entry : substitutions.entrySet())
result += "(" + entry.getKey() + " -> " + entry.getValue() + "), ";
if(!substitutions.isEmpty())
result = result.substring(0, result.length()-2);
result += " }";
return result;
}
@Override
public Iterator<Entry<PlaceholderType, UnifyType>> iterator() {
return substitutions.entrySet().iterator();
}
}
@@ -0,0 +1,247 @@
package de.dhbwstuttgart.typeinference.unify.model;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
/**
* A pair which contains two types and an operator, e.q. (Integer <. a).
* @author Florian Steurer
*/
public class UnifyPair {
/**
* The type on the left hand side of the pair.
*/
private final UnifyType lhs;
/**
* The type on the right hand side of the pair.
*/
private final UnifyType rhs;
/**
* The operator that determines the relation between the left and right hand side type.
*/
private PairOperator pairOp;
private boolean undefinedPair = false;
/**
* Unifier/substitute that generated this pair
* PL 2018-03-15
*/
private Set<UnifyPair> substitution;
/**
* Base on which the the unifier is applied
* PL 2018-03-15
*/
private UnifyPair basePair;
/**
* For pairs a <. Theta generated in the rule reduceTphSup
* to store the f-Bouned Elements to avoid endless recursion
* PL 2018-03-15
*/
private Set<UnifyType> fBounded = new HashSet<>();
private final int hashCode;
/**
* Creates a new instance of the pair.
* @param lhs The type on the left hand side of the pair.
* @param rhs The type on the right hand side of the pair.
* @param op The operator that determines the relation between the left and right hand side type.
*/
public UnifyPair(UnifyType lhs, UnifyType rhs, PairOperator op) {
this.lhs = lhs;
this.rhs = rhs;
pairOp = op;
substitution = new HashSet<>();
// Caching hashcode
hashCode = 17 + 31 * lhs.hashCode() + 31 * rhs.hashCode() + 31 * pairOp.hashCode();
}
public UnifyPair(UnifyType lhs, UnifyType rhs, PairOperator op, Set<UnifyPair> uni, UnifyPair base) {
this.lhs = lhs;
this.rhs = rhs;
pairOp = op;
substitution = uni;
basePair = base;
// Caching hashcode
hashCode = 17 + 31 * lhs.hashCode() + 31 * rhs.hashCode() + 31 * pairOp.hashCode();
}
public UnifyPair(UnifyType lhs, UnifyType rhs, PairOperator op, Set<UnifyPair> uni, UnifyPair base, Set<UnifyType> fBounded) {
this(lhs, rhs, op, uni, base);
this.fBounded = fBounded;
}
/**
* Returns the type on the left hand side of the pair.
*/
public UnifyType getLhsType() {
return lhs;
}
/**
* Returns the type on the right hand side of the pair.
*/
public UnifyType getRhsType() {
return rhs;
}
/**
* Returns the operator that determines the relation between the left and right hand side type.
*/
public PairOperator getPairOp() {
return pairOp;
}
public void setPairOp(PairOperator po) {
pairOp = po;
}
public void addSubstitutions(Set<UnifyPair> sup) {
substitution.addAll(sup);
}
public void setUndefinedPair() {
undefinedPair = true;
}
public Set<UnifyPair> getSubstitution() {
return new HashSet<>(substitution);
}
public UnifyPair getBasePair() {
return basePair;
}
public boolean isUndefinedPair() {
return undefinedPair;
}
public Set<UnifyPair> getAllSubstitutions () {
Set<UnifyPair> ret = new HashSet<>();
ret.addAll(new ArrayList<>(getSubstitution()));
if (basePair != null) {
ret.addAll(new ArrayList<>(basePair.getAllSubstitutions()));
}
return ret;
}
public Set<UnifyPair> getThisAndAllBases () {
Set<UnifyPair> ret = getAllBases();
ret.add(this);
return ret;
}
public Set<UnifyPair> getAllBases () {
Set<UnifyPair> ret = new HashSet<>();
if (basePair != null) {
ret.add(getBasePair());
ret.addAll(basePair.getAllBases());
}
return ret;
}
public UnifyPair getGroundBasePair () {
if (basePair == null) {
return this;
}
if (basePair.getBasePair() == null) {
return basePair;
}
else {
return basePair.getGroundBasePair();
}
}
/**
* wenn in einem Paar bestehend aus 2 Typvariablen eine nicht wildcardtable ist,
* so beide auf nicht wildcardtable setzen
*/
public void disableCondWildcards() {
if (lhs instanceof PlaceholderType && rhs instanceof PlaceholderType
&& (!((PlaceholderType)lhs).isWildcardable() || !((PlaceholderType)rhs).isWildcardable()))
{
((PlaceholderType)lhs).disableWildcardtable();
((PlaceholderType)rhs).disableWildcardtable();
}
}
public Boolean wrongWildcard() {
return lhs.wrongWildcard() || rhs.wrongWildcard();
}
public Set<UnifyType> getfBounded() {
return this.fBounded;
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof UnifyPair))
return false;
if(obj.hashCode() != this.hashCode())
return false;
UnifyPair other = (UnifyPair) obj;
if (isUndefinedPair()) {
if (other.getBasePair() != basePair || (other.getBasePair() == null && basePair == null)) {
return false;
}
if (!other.getBasePair().equals(basePair) ||
!other.getAllSubstitutions().equals(getAllSubstitutions())) {
return false;
}
}
return other.getPairOp() == pairOp
&& other.getLhsType().equals(lhs)
&& other.getRhsType().equals(rhs);
}
@Override
public int hashCode() {
return hashCode;
}
@Override
public String toString() {
String ret = "";
if (lhs instanceof PlaceholderType) {
ret = new Integer(((PlaceholderType)lhs).getVariance()).toString() + " "
+ "WC: " + ((PlaceholderType)lhs).isWildcardable()
+ ", IT: " + ((PlaceholderType)lhs).isInnerType();
}
if (rhs instanceof PlaceholderType) {
ret = ret + ", " + new Integer(((PlaceholderType)rhs).getVariance()).toString() + " "
+ "WC: " + ((PlaceholderType)rhs).isWildcardable()
+ ", IT: " + ((PlaceholderType)rhs).isInnerType();
}
return "(" + lhs + " " + pairOp + " " + rhs + ", " + ret + ")"; //+ ", [" + getfBounded().toString()+ "])";
}
/*
public List<? extends PlaceholderType> getInvolvedPlaceholderTypes() {
ArrayList<PlaceholderType> ret = new ArrayList<>();
ret.addAll(lhs.getInvolvedPlaceholderTypes());
ret.addAll(rhs.getInvolvedPlaceholderTypes());
return ret;
}
*/
}
@@ -0,0 +1,119 @@
package de.dhbwstuttgart.typeinference.unify.model;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
import de.dhbwstuttgart.typeinference.unify.interfaces.UnifyTypeVisitor;
/**
* Represents a java type.
* @author Florian Steurer
*/
public abstract class UnifyType {
/**
* The name of the type e.q. "Integer", "? extends Integer" or "List" for (List<T>)
*/
protected final String typeName;
/**
* The type parameters of the type.
*/
protected final TypeParams typeParams;
/**
* Creates a new instance
* @param name Name of the type (e.q. List for List<T>, Integer or ? extends Integer)
* @param typeParams Parameters of the type (e.q. <T> for List<T>)
*/
protected UnifyType(String name, TypeParams p) {
typeName = name;
typeParams = p;
}
abstract public <T> UnifyType accept(UnifyTypeVisitor<T> visitor, T ht);
/**
* Returns the name of the type.
* @return The name e.q. List for List<T>, Integer or ? extends Integer
*/
public String getName() {
return typeName;
}
/**
* The parameters of the type.
* @return Parameters of the type, e.q. <T> for List<T>.
*/
public TypeParams getTypeParams() {
return typeParams;
}
/**
* Returns a new type that equals this type except for the type parameters.
* @param newTp The type params of the new type.
* @return A new type object.
*/
public abstract UnifyType setTypeParams(TypeParams newTp);
/**
* Implementation of the visitor-pattern. Returns the set of smArg
* by calling the most specific overload in the FC.
* @param fc The FC that is called.
* @return The set that is smArg(this)
*/
abstract Set<UnifyType> smArg(IFiniteClosure fc, Set<UnifyType> fBounded);
/**
* Implementation of the visitor-pattern. Returns the set of grArg
* by calling the most specific overload in the FC.
* @param fc The FC that is called.
* @return The set that is grArg(this)
*/
abstract Set<UnifyType> grArg(IFiniteClosure fc, Set<UnifyType> fBounded);
/**
* Applies a unifier to this object.
* @param unif The unifier
* @return A UnifyType, that may or may not be a new object, that has its subtypes substituted.
*/
abstract UnifyType apply(Unifier unif);
@Override
public String toString() {
String params = "";
if(typeParams.size() != 0) {
for(UnifyType param : typeParams)
params += param.toString() + ",";
params = "<" + params.substring(0, params.length()-1) + ">";
}
return typeName + params;
}
public Collection<PlaceholderType> getInvolvedPlaceholderTypes() {
ArrayList<PlaceholderType> ret = new ArrayList<>();
ret.addAll(typeParams.getInvolvedPlaceholderTypes());
return ret;
}
public Boolean wrongWildcard() {//default
return false;
}
@Override
public int hashCode() {
return this.toString().hashCode();
}
@Override
public boolean equals(Object obj) {
if(obj == null)return false;
return this.toString().equals(obj.toString());
}
}
@@ -0,0 +1,72 @@
package de.dhbwstuttgart.typeinference.unify.model;
import java.util.ArrayList;
import java.util.Collection;
/**
* A wildcard type that is either a ExtendsType or a SuperType.
* @author Florian Steurer
*/
public abstract class WildcardType extends UnifyType {
/**
* The wildcarded type, e.q. Integer for ? extends Integer. Never a wildcard type itself.
*/
protected UnifyType wildcardedType;
/**
* Creates a new instance.
* @param name The name of the type, e.q. ? extends Integer
* @param wildcardedType The wildcarded type, e.q. Integer for ? extends Integer. Never a wildcard type itself.
*/
protected WildcardType(String name, UnifyType wildcardedType) {
super(name, wildcardedType.getTypeParams());
this.wildcardedType = wildcardedType;
}
/**
* Returns the wildcarded type, e.q. Integer for ? extends Integer.
* @return The wildcarded type. Never a wildcard type itself.
*/
public UnifyType getWildcardedType() {
return wildcardedType;
}
/**
* Returns the type parameters of the WILDCARDED TYPE.
*/
@Override
public TypeParams getTypeParams() {
return wildcardedType.getTypeParams();
}
@Override
public Boolean wrongWildcard () {//This is an error
return (wildcardedType instanceof WildcardType);
}
@Override
public int hashCode() {
return wildcardedType.hashCode() + getName().hashCode() + 17;
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof WildcardType))
return false;
if(obj.hashCode() != this.hashCode())
return false;
WildcardType other = (WildcardType) obj;
return other.getWildcardedType().equals(wildcardedType);
}
@Override
public Collection<PlaceholderType> getInvolvedPlaceholderTypes() {
ArrayList<PlaceholderType> ret = new ArrayList<>();
ret.addAll(wildcardedType.getInvolvedPlaceholderTypes());
return ret;
}
}
@@ -0,0 +1,25 @@
package de.dhbwstuttgart.typeinference.unify.model;
public class hashKeyType {
UnifyType realType;
hashKeyType(UnifyType realType) {
this.realType= realType;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof hashKeyType) {
return realType.equals(((hashKeyType)obj).realType);
}
else
{
return false;
}
}
@Override
public int hashCode() {
return realType.hashCode();
}
}
@@ -0,0 +1,47 @@
package de.dhbwstuttgart.typeinference.unify;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.HashMap;
import java.util.stream.Collectors;
import de.dhbwstuttgart.typeinference.unify.interfaces.UnifyTypeVisitor;
import de.dhbwstuttgart.typeinference.unify.model.ExtendsType;
import de.dhbwstuttgart.typeinference.unify.model.FunNType;
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
import de.dhbwstuttgart.typeinference.unify.model.ReferenceType;
import de.dhbwstuttgart.typeinference.unify.model.SuperType;
import de.dhbwstuttgart.typeinference.unify.model.TypeParams;
public class visitUnifyTypeVisitor<T> implements UnifyTypeVisitor<T> {
public ReferenceType visit(ReferenceType refty, T ht) {
return new ReferenceType(refty.getName(),
new TypeParams(
Arrays.stream(refty.getTypeParams().get())
.map(x -> x.accept(this, ht))
.collect(Collectors.toCollection(ArrayList::new))));
}
public PlaceholderType visit(PlaceholderType phty, T ht) {
return phty;
}
public FunNType visit(FunNType funnty, T ht) {
return FunNType.getFunNType(
new TypeParams(
Arrays.stream(funnty.getTypeParams().get())
.map(x -> x.accept(this, ht))
.collect(Collectors.toCollection(ArrayList::new)))
);
}
public SuperType visit(SuperType suty, T ht) {
return new SuperType(suty.getWildcardedType().accept(this, ht));
}
public ExtendsType visit(ExtendsType extty, T ht) {
return new ExtendsType(extty.getWildcardedType().accept(this, ht));
}
}
@@ -0,0 +1,19 @@
package de.dhbwstuttgart.util;
import java.util.ArrayList;
public class BiRelation<X,Y> extends ArrayList<Pair<X,Y>>{
public void put(X x, Y y) {
this.add(new Pair<>(x,y));
}
public void put(Pair<X,Y> p) {
this.add(p);
}
public void putAll(BiRelation<X,Y> br) {
this.addAll(br);
}
}
@@ -0,0 +1,25 @@
package de.dhbwstuttgart.util;
import java.util.Optional;
public class Pair<T, T1> {
private final T key;
private final T1 value;
public Pair(T a, T1 b) {
this.value = b;
this.key = a;
}
public Optional<T1> getValue() {
return Optional.of(value);
}
public T getKey() {
return key;
}
public String toString() {
return "(" + key.toString() + "," + value.toString() + ")\n";
}
}
@@ -1,427 +0,0 @@
{ _b<._E, _a<.java.util.concurrent.ConcurrentLinkedDeque |
_b<.javax.swing.JMenuItem, _a<.javax.swing.JPopupMenu |
_b<.java.math.BigInteger, _a<.java.math.BigInteger |
_b<.java.awt.MenuItem, _a<.java.awt.Menu |
_b<.java.lang.Object, _a<.java.beans.beancontext.BeanContextSupport |
_b<.javax.xml.stream.XMLEventReader, _a<.javax.xml.stream.XMLEventWriter |
_b<._E, _a<.java.util.AbstractList |
_b<._E, _a<.java.util.HashSet |
_b<._E, _a<.java.util.ListIterator |
_b<._E, _a<.java.util.LinkedList |
_b<.java.awt.geom.Point2D, _a<.java.awt.geom.Rectangle2D |
_b<._E, _a<.java.util.concurrent.DelayQueue |
_b<._E, _a<.java.util.concurrent.CopyOnWriteArrayList |
_b<._E, _a<.java.util.AbstractQueue |
_b<.double, _a<.java.util.concurrent.atomic.DoubleAdder |
_b<.java.lang.String, _a<.javax.naming.CompoundName |
_b<._E, _a<.java.util.List |
_b<.javax.swing.JMenuItem, _a<.javax.swing.JMenu |
_b<.java.security.Permission, _a<.java.security.Permissions |
_b<.long, _a<.java.util.stream.LongStream$Builder |
_b<._E, _a<.java.util.AbstractCollection |
_b<._E, _a<.java.util.concurrent.PriorityBlockingQueue |
_b<.java.lang.CharSequence, _a<.java.util.StringJoiner |
_b<._E, _a<.java.util.concurrent.ArrayBlockingQueue |
_b<.javax.swing.JMenu, _a<.javax.swing.JMenuBar |
_b<.java.math.BigDecimal, _a<.java.math.BigDecimal |
_b<.java.lang.String, _a<.javax.swing.JPopupMenu |
_b<.javax.management.relation.Role, _a<.javax.management.relation.RoleList |
_b<.java.lang.String, _a<.javax.naming.Name |
_b<.javax.xml.datatype.Duration, _a<.javax.xml.datatype.Duration |
_b<.javax.accessibility.AccessibleState, _a<.javax.accessibility.AccessibleStateSet |
_b<.javax.naming.RefAddr, _a<.javax.naming.Reference |
_b<.javax.xml.stream.events.XMLEvent, _a<.javax.xml.stream.util.XMLEventConsumer |
_b<._E, _a<.java.util.concurrent.ConcurrentSkipListSet |
_b<._E, _a<.java.util.ArrayList |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintServiceAttributeSet |
_b<.java.lang.Object, _a<.javax.naming.directory.BasicAttribute |
_b<._E, _a<.java.util.concurrent.ConcurrentLinkedQueue |
_b<.java.lang.String, _a<.java.awt.Choice |
_b<.java.lang.Object, _a<.javax.management.relation.RoleUnresolvedList |
_b<.javax.accessibility.AccessibleRelation, _a<.javax.accessibility.AccessibleRelationSet |
_b<.java.awt.RenderingHints, _a<.java.awt.RenderingHints |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.HashAttributeSet |
_b<.java.awt.geom.Rectangle2D, _a<.java.awt.geom.Rectangle2D |
_b<.javax.naming.ldap.Rdn, _a<.javax.naming.ldap.LdapName |
_b<._E, _a<.java.util.Set |
_b<.java.awt.TrayIcon, _a<.java.awt.SystemTray |
_b<.javax.sound.midi.MidiEvent, _a<.javax.sound.midi.Track |
_b<.java.awt.Component, _a<.javax.swing.JMenu |
_b<.short, _a<.java.awt.image.renderable.ParameterBlock |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintRequestAttributeSet |
_b<.float, _a<.java.awt.image.renderable.ParameterBlock |
_b<._E, _a<.java.util.concurrent.LinkedBlockingDeque |
_b<.javax.swing.Action, _a<.javax.swing.JToolBar |
_b<.java.lang.String, _a<.javax.naming.ldap.LdapName |
_b<.java.awt.Component, _a<.javax.swing.JTabbedPane |
_b<.java.lang.Object, _a<.javax.management.relation.RoleList |
_b<._T, _a<.java.util.stream.Stream$Builder |
_b<._K, _a<.java.util.concurrent.ConcurrentHashMap$KeySetView |
_b<.char, _a<.java.awt.image.renderable.ParameterBlock |
_b<._E, _a<.java.util.concurrent.LinkedTransferQueue |
_b<._E, _a<.java.util.Queue |
_b<.javax.swing.Action, _a<.javax.swing.JMenu |
_b<.java.awt.Component, _a<.java.awt.Container |
_b<.java.awt.geom.Area, _a<.java.awt.geom.Area |
_b<._E, _a<.java.util.Vector |
_b<._E, _a<.java.util.TreeSet |
_b<.java.lang.String, _a<.java.awt.List |
_b<.java.lang.String, _a<.javax.naming.CompositeName |
_b<.java.awt.PopupMenu, _a<.java.awt.Component |
_b<.int, _a<.java.awt.image.renderable.ParameterBlock |
_b<._E, _a<.java.util.concurrent.CopyOnWriteArraySet |
_b<.java.awt.Rectangle, _a<.java.awt.Rectangle |
_b<._E, _a<.java.util.PriorityQueue |
_b<.long, _a<.java.awt.image.renderable.ParameterBlock |
_b<.javax.swing.AbstractButton, _a<.javax.swing.ButtonGroup |
_b<.int, _a<.java.util.stream.IntStream$Builder |
_b<.java.lang.String, _a<.javax.swing.JMenu |
_b<._E, _a<.java.util.concurrent.BlockingQueue |
_b<.byte, _a<.java.awt.image.renderable.ParameterBlock |
_b<.java.lang.Object, _a<.javax.management.AttributeList |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.DocAttributeSet |
_b<.java.security.Permission, _a<.java.security.PermissionCollection |
_b<.double, _a<.java.util.stream.DoubleStream$Builder |
_b<.java.lang.Object, _a<.java.util.concurrent.DelayQueue |
_b<.javax.swing.Action, _a<.javax.swing.JPopupMenu |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSet |
_b<.java.lang.Object, _a<.javax.naming.directory.Attribute |
_b<.javax.management.relation.RoleUnresolved, _a<.javax.management.relation.RoleUnresolvedList |
_b<.java.lang.Object, _a<.javax.print.attribute.standard.JobStateReasons |
_b<._E, _a<.java.util.Deque |
_b<._E, _a<.java.util.Collection |
_b<.java.lang.String, _a<.java.awt.Menu |
_b<.javax.xml.datatype.Duration, _a<.javax.xml.datatype.XMLGregorianCalendar |
_b<.long, _a<.java.util.concurrent.atomic.LongAdder |
_b<.java.awt.Menu, _a<.java.awt.MenuBar |
_b<.javax.swing.tree.MutableTreeNode, _a<.javax.swing.tree.DefaultMutableTreeNode |
_b<.javax.management.Attribute, _a<.javax.management.AttributeList |
_b<.double, _a<.java.awt.image.renderable.ParameterBlock |
_b<.java.awt.Point, _a<.java.awt.Rectangle |
_b<.javax.xml.stream.events.XMLEvent, _a<.javax.xml.stream.XMLEventWriter |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintJobAttributeSet |
_b<._E, _a<.java.util.concurrent.BlockingDeque |
_b<.java.lang.Object, _a<.java.awt.image.renderable.ParameterBlock |
_b<.javax.print.attribute.standard.JobStateReason, _a<.javax.print.attribute.standard.JobStateReasons |
_b<._E, _a<.java.util.ArrayDeque }
{ _c<.java.lang.Object, _b<.java.awt.image.renderable.ParameterBlock |
_c<.javax.accessibility.AccessibleState, _b<.javax.accessibility.AccessibleStateSet |
_c<._E, _b<.java.util.List |
_c<.javax.xml.datatype.Duration, _b<.javax.xml.datatype.XMLGregorianCalendar |
_c<._E, _b<.java.util.ListIterator |
_c<._E, _b<.java.util.concurrent.PriorityBlockingQueue |
_c<._E, _b<.java.util.Vector |
_c<._E, _b<.java.util.concurrent.CopyOnWriteArrayList |
_c<.java.awt.geom.Rectangle2D, _b<.java.awt.geom.Rectangle2D |
_c<._E, _b<.java.util.AbstractList |
_c<.java.lang.String, _b<.javax.naming.ldap.LdapName |
_c<._T, _b<.java.util.stream.Stream$Builder |
_c<.java.awt.Point, _b<.java.awt.Rectangle |
_c<.java.lang.String, _b<.javax.swing.JMenu |
_c<._E, _b<.java.util.concurrent.CopyOnWriteArraySet |
_c<.javax.xml.stream.XMLEventReader, _b<.javax.xml.stream.XMLEventWriter |
_c<.java.lang.String, _b<.java.awt.List |
_c<.java.lang.String, _b<.javax.naming.CompositeName |
_c<.java.lang.String, _b<.javax.naming.CompoundName |
_c<._E, _b<.java.util.concurrent.ConcurrentLinkedDeque |
_c<.float, _b<.java.awt.image.renderable.ParameterBlock |
_c<.short, _b<.java.awt.image.renderable.ParameterBlock |
_c<.java.awt.Component, _b<.javax.swing.JTabbedPane |
_c<._E, _b<.java.util.concurrent.LinkedTransferQueue |
_c<.java.awt.TrayIcon, _b<.java.awt.SystemTray |
_c<._E, _b<.java.util.concurrent.ConcurrentSkipListSet |
_c<.javax.print.attribute.Attribute, _b<.javax.print.attribute.PrintRequestAttributeSet |
_c<.javax.swing.AbstractButton, _b<.javax.swing.ButtonGroup |
_c<.javax.sound.midi.MidiEvent, _b<.javax.sound.midi.Track |
_c<.java.awt.Component, _b<.java.awt.Container |
_c<.javax.xml.stream.events.XMLEvent, _b<.javax.xml.stream.XMLEventWriter |
_c<._E, _b<.java.util.ArrayDeque |
_c<.javax.xml.stream.events.XMLEvent, _b<.javax.xml.stream.util.XMLEventConsumer |
_c<.java.awt.Menu, _b<.java.awt.MenuBar |
_c<.char, _b<.java.awt.image.renderable.ParameterBlock |
_c<.java.awt.geom.Area, _b<.java.awt.geom.Area |
_c<.javax.management.Attribute, _b<.javax.management.AttributeList |
_c<.javax.swing.Action, _b<.javax.swing.JMenu |
_c<.java.lang.Object, _b<.java.util.concurrent.DelayQueue |
_c<.java.awt.Rectangle, _b<.java.awt.Rectangle |
_c<.javax.swing.Action, _b<.javax.swing.JToolBar |
_c<.javax.swing.tree.MutableTreeNode, _b<.javax.swing.tree.DefaultMutableTreeNode |
_c<.double, _b<.java.util.concurrent.atomic.DoubleAdder |
_c<.java.lang.String, _b<.java.awt.Menu |
_c<._E, _b<.java.util.concurrent.BlockingQueue |
_c<._E, _b<.java.util.concurrent.DelayQueue |
_c<._E, _b<.java.util.concurrent.ArrayBlockingQueue |
_c<._E, _b<.java.util.Deque |
_c<._E, _b<.java.util.Collection |
_c<.javax.management.relation.Role, _b<.javax.management.relation.RoleList |
_c<.java.lang.Object, _b<.javax.naming.directory.BasicAttribute |
_c<.javax.print.attribute.standard.JobStateReason, _b<.javax.print.attribute.standard.JobStateReasons |
_c<._E, _b<.java.util.TreeSet |
_c<._E, _b<.java.util.concurrent.ConcurrentLinkedQueue |
_c<.javax.swing.Action, _b<.javax.swing.JPopupMenu |
_c<.java.awt.geom.Point2D, _b<.java.awt.geom.Rectangle2D |
_c<.double, _b<.java.awt.image.renderable.ParameterBlock |
_c<._E, _b<.java.util.LinkedList |
_c<.java.security.Permission, _b<.java.security.PermissionCollection |
_c<.javax.naming.ldap.Rdn, _b<.javax.naming.ldap.LdapName |
_c<.java.math.BigInteger, _b<.java.math.BigInteger |
_c<.java.awt.MenuItem, _b<.java.awt.Menu |
_c<.long, _b<.java.util.concurrent.atomic.LongAdder |
_c<.long, _b<.java.util.stream.LongStream$Builder |
_c<.int, _b<.java.awt.image.renderable.ParameterBlock |
_c<._E, _b<.java.util.AbstractCollection |
_c<.java.lang.Object, _b<.javax.naming.directory.Attribute |
_c<.javax.print.attribute.Attribute, _b<.javax.print.attribute.HashAttributeSet |
_c<._K, _b<.java.util.concurrent.ConcurrentHashMap$KeySetView |
_c<.java.lang.Object, _b<.java.beans.beancontext.BeanContextSupport |
_c<._E, _b<.java.util.ArrayList |
_c<.java.lang.String, _b<.java.awt.Choice |
_c<.javax.xml.datatype.Duration, _b<.javax.xml.datatype.Duration |
_c<.java.lang.String, _b<.javax.naming.Name |
_c<.java.math.BigDecimal, _b<.java.math.BigDecimal |
_c<._E, _b<.java.util.concurrent.BlockingDeque |
_c<.java.lang.String, _b<.javax.swing.JPopupMenu |
_c<._E, _b<.java.util.Queue |
_c<.java.lang.Object, _b<.javax.management.AttributeList |
_c<.java.awt.PopupMenu, _b<.java.awt.Component |
_c<.java.lang.CharSequence, _b<.java.util.StringJoiner |
_c<.java.awt.Component, _b<.javax.swing.JMenu |
_c<.javax.print.attribute.Attribute, _b<.javax.print.attribute.AttributeSet |
_c<.javax.swing.JMenu, _b<.javax.swing.JMenuBar |
_c<.javax.print.attribute.Attribute, _b<.javax.print.attribute.DocAttributeSet |
_c<.javax.print.attribute.Attribute, _b<.javax.print.attribute.PrintServiceAttributeSet |
_c<.javax.naming.RefAddr, _b<.javax.naming.Reference |
_c<.java.lang.Object, _b<.javax.print.attribute.standard.JobStateReasons |
_c<.java.lang.Object, _b<.javax.management.relation.RoleUnresolvedList |
_c<.javax.swing.JMenuItem, _b<.javax.swing.JPopupMenu |
_c<._E, _b<.java.util.Set |
_c<._E, _b<.java.util.concurrent.LinkedBlockingDeque |
_c<.java.lang.Object, _b<.javax.management.relation.RoleList |
_c<.javax.print.attribute.Attribute, _b<.javax.print.attribute.PrintJobAttributeSet |
_c<.javax.accessibility.AccessibleRelation, _b<.javax.accessibility.AccessibleRelationSet |
_c<._E, _b<.java.util.PriorityQueue |
_c<.java.security.Permission, _b<.java.security.Permissions |
_c<.javax.management.relation.RoleUnresolved, _b<.javax.management.relation.RoleUnresolvedList |
_c<.long, _b<.java.awt.image.renderable.ParameterBlock |
_c<.java.awt.RenderingHints, _b<.java.awt.RenderingHints |
_c<._E, _b<.java.util.AbstractQueue |
_c<.javax.swing.JMenuItem, _b<.javax.swing.JMenu |
_c<.byte, _b<.java.awt.image.renderable.ParameterBlock |
_c<._E, _b<.java.util.HashSet |
_c<.double, _b<.java.util.stream.DoubleStream$Builder |
_c<.int, _b<.java.util.stream.IntStream$Builder }
{ _d<._E, _c<.java.util.concurrent.ConcurrentLinkedQueue |
_d<._E, _c<.java.util.Collection |
_d<._E, _c<.java.util.AbstractCollection |
_d<.java.awt.geom.Area, _c<.java.awt.geom.Area |
_d<._E, _c<.java.util.TreeSet |
_d<.java.lang.Object, _c<.java.util.concurrent.DelayQueue |
_d<.javax.print.attribute.Attribute, _c<.javax.print.attribute.PrintJobAttributeSet |
_d<.java.awt.Rectangle, _c<.java.awt.Rectangle |
_d<.java.lang.Object, _c<.javax.naming.directory.Attribute |
_d<._E, _c<.java.util.concurrent.CopyOnWriteArrayList |
_d<.java.awt.PopupMenu, _c<.java.awt.Component |
_d<.java.lang.Object, _c<.javax.naming.directory.BasicAttribute |
_d<.javax.management.relation.Role, _c<.javax.management.relation.RoleList |
_d<.javax.swing.Action, _c<.javax.swing.JToolBar |
_d<._E, _c<.java.util.AbstractList |
_d<._E, _c<.java.util.PriorityQueue |
_d<._E, _c<.java.util.ArrayDeque |
_d<.javax.swing.tree.MutableTreeNode, _c<.javax.swing.tree.DefaultMutableTreeNode |
_d<.double, _c<.java.util.stream.DoubleStream$Builder |
_d<.java.lang.String, _c<.javax.swing.JPopupMenu |
_d<.javax.xml.datatype.Duration, _c<.javax.xml.datatype.Duration |
_d<.byte, _c<.java.awt.image.renderable.ParameterBlock |
_d<.long, _c<.java.awt.image.renderable.ParameterBlock |
_d<._E, _c<.java.util.ListIterator |
_d<.javax.swing.JMenuItem, _c<.javax.swing.JMenu |
_d<.char, _c<.java.awt.image.renderable.ParameterBlock |
_d<.java.awt.Component, _c<.java.awt.Container |
_d<._E, _c<.java.util.concurrent.BlockingQueue |
_d<.java.awt.geom.Point2D, _c<.java.awt.geom.Rectangle2D |
_d<.javax.swing.Action, _c<.javax.swing.JPopupMenu |
_d<.java.lang.Object, _c<.javax.management.relation.RoleList |
_d<.java.lang.String, _c<.javax.naming.Name |
_d<.javax.naming.RefAddr, _c<.javax.naming.Reference |
_d<.java.lang.String, _c<.javax.naming.CompositeName |
_d<.javax.xml.stream.events.XMLEvent, _c<.javax.xml.stream.util.XMLEventConsumer |
_d<.java.lang.Object, _c<.java.awt.image.renderable.ParameterBlock |
_d<.javax.accessibility.AccessibleState, _c<.javax.accessibility.AccessibleStateSet |
_d<.javax.print.attribute.Attribute, _c<.javax.print.attribute.DocAttributeSet |
_d<.javax.accessibility.AccessibleRelation, _c<.javax.accessibility.AccessibleRelationSet |
_d<.java.awt.Menu, _c<.java.awt.MenuBar |
_d<._E, _c<.java.util.List |
_d<.javax.print.attribute.Attribute, _c<.javax.print.attribute.AttributeSet |
_d<.java.lang.String, _c<.javax.naming.CompoundName |
_d<._E, _c<.java.util.LinkedList |
_d<.long, _c<.java.util.concurrent.atomic.LongAdder |
_d<._E, _c<.java.util.Queue |
_d<._E, _c<.java.util.concurrent.LinkedTransferQueue |
_d<.java.math.BigInteger, _c<.java.math.BigInteger |
_d<._E, _c<.java.util.concurrent.BlockingDeque |
_d<.javax.swing.JMenuItem, _c<.javax.swing.JPopupMenu |
_d<.java.lang.Object, _c<.javax.management.relation.RoleUnresolvedList |
_d<.javax.xml.stream.XMLEventReader, _c<.javax.xml.stream.XMLEventWriter |
_d<.java.awt.RenderingHints, _c<.java.awt.RenderingHints |
_d<.java.lang.String, _c<.java.awt.Menu |
_d<._E, _c<.java.util.Set |
_d<.javax.swing.JMenu, _c<.javax.swing.JMenuBar |
_d<.java.lang.Object, _c<.javax.management.AttributeList |
_d<._E, _c<.java.util.Vector |
_d<._E, _c<.java.util.concurrent.DelayQueue |
_d<._E, _c<.java.util.AbstractQueue |
_d<.int, _c<.java.awt.image.renderable.ParameterBlock |
_d<.java.awt.Point, _c<.java.awt.Rectangle |
_d<.java.lang.String, _c<.javax.swing.JMenu |
_d<.double, _c<.java.util.concurrent.atomic.DoubleAdder |
_d<.javax.management.relation.RoleUnresolved, _c<.javax.management.relation.RoleUnresolvedList |
_d<.java.security.Permission, _c<.java.security.PermissionCollection |
_d<.java.security.Permission, _c<.java.security.Permissions |
_d<._E, _c<.java.util.concurrent.LinkedBlockingDeque |
_d<.javax.naming.ldap.Rdn, _c<.javax.naming.ldap.LdapName |
_d<._E, _c<.java.util.concurrent.ConcurrentLinkedDeque |
_d<.int, _c<.java.util.stream.IntStream$Builder |
_d<.java.awt.geom.Rectangle2D, _c<.java.awt.geom.Rectangle2D |
_d<._E, _c<.java.util.Deque |
_d<._E, _c<.java.util.ArrayList |
_d<.java.lang.String, _c<.javax.naming.ldap.LdapName |
_d<._E, _c<.java.util.HashSet |
_d<.javax.swing.AbstractButton, _c<.javax.swing.ButtonGroup |
_d<.java.lang.String, _c<.java.awt.List |
_d<.java.lang.Object, _c<.java.beans.beancontext.BeanContextSupport |
_d<._K, _c<.java.util.concurrent.ConcurrentHashMap$KeySetView |
_d<.javax.xml.datatype.Duration, _c<.javax.xml.datatype.XMLGregorianCalendar |
_d<.javax.management.Attribute, _c<.javax.management.AttributeList |
_d<.java.math.BigDecimal, _c<.java.math.BigDecimal |
_d<.javax.xml.stream.events.XMLEvent, _c<.javax.xml.stream.XMLEventWriter |
_d<.double, _c<.java.awt.image.renderable.ParameterBlock |
_d<._E, _c<.java.util.concurrent.ArrayBlockingQueue |
_d<.javax.print.attribute.Attribute, _c<.javax.print.attribute.HashAttributeSet |
_d<._E, _c<.java.util.concurrent.ConcurrentSkipListSet |
_d<.javax.print.attribute.standard.JobStateReason, _c<.javax.print.attribute.standard.JobStateReasons |
_d<._E, _c<.java.util.concurrent.PriorityBlockingQueue |
_d<.javax.swing.Action, _c<.javax.swing.JMenu |
_d<.java.awt.MenuItem, _c<.java.awt.Menu |
_d<.short, _c<.java.awt.image.renderable.ParameterBlock |
_d<.float, _c<.java.awt.image.renderable.ParameterBlock |
_d<.java.lang.CharSequence, _c<.java.util.StringJoiner |
_d<.javax.print.attribute.Attribute, _c<.javax.print.attribute.PrintRequestAttributeSet |
_d<.long, _c<.java.util.stream.LongStream$Builder |
_d<.java.awt.Component, _c<.javax.swing.JMenu |
_d<.java.lang.String, _c<.java.awt.Choice |
_d<.java.lang.Object, _c<.javax.print.attribute.standard.JobStateReasons |
_d<._E, _c<.java.util.concurrent.CopyOnWriteArraySet |
_d<.javax.sound.midi.MidiEvent, _c<.javax.sound.midi.Track |
_d<._T, _c<.java.util.stream.Stream$Builder |
_d<.javax.print.attribute.Attribute, _c<.javax.print.attribute.PrintServiceAttributeSet |
_d<.java.awt.Component, _c<.javax.swing.JTabbedPane |
_d<.java.awt.TrayIcon, _c<.java.awt.SystemTray }
{ _a<.long, _d<.java.util.concurrent.atomic.LongAdder |
_a<.java.lang.Object, _d<.java.util.concurrent.DelayQueue |
_a<.java.awt.geom.Rectangle2D, _d<.java.awt.geom.Rectangle2D |
_a<._E, _d<.java.util.concurrent.ConcurrentLinkedQueue |
_a<.int, _d<.java.util.stream.IntStream$Builder |
_a<.javax.xml.datatype.Duration, _d<.javax.xml.datatype.Duration |
_a<.java.lang.String, _d<.javax.naming.ldap.LdapName |
_a<._E, _d<.java.util.TreeSet |
_a<.javax.print.attribute.Attribute, _d<.javax.print.attribute.AttributeSet |
_a<.double, _d<.java.awt.image.renderable.ParameterBlock |
_a<.java.awt.geom.Point2D, _d<.java.awt.geom.Rectangle2D |
_a<.java.awt.RenderingHints, _d<.java.awt.RenderingHints |
_a<.javax.print.attribute.Attribute, _d<.javax.print.attribute.HashAttributeSet |
_a<.java.lang.String, _d<.javax.swing.JMenu |
_a<.javax.management.relation.Role, _d<.javax.management.relation.RoleList |
_a<._E, _d<.java.util.Queue |
_a<._E, _d<.java.util.concurrent.CopyOnWriteArrayList |
_a<._E, _d<.java.util.ArrayDeque |
_a<.java.lang.String, _d<.javax.naming.CompositeName |
_a<.java.lang.Object, _d<.javax.management.AttributeList |
_a<.javax.accessibility.AccessibleState, _d<.javax.accessibility.AccessibleStateSet |
_a<.java.lang.String, _d<.java.awt.List |
_a<.java.awt.Menu, _d<.java.awt.MenuBar |
_a<.float, _d<.java.awt.image.renderable.ParameterBlock |
_a<.java.security.Permission, _d<.java.security.PermissionCollection |
_a<.javax.swing.tree.MutableTreeNode, _d<.javax.swing.tree.DefaultMutableTreeNode |
_a<.java.awt.TrayIcon, _d<.java.awt.SystemTray |
_a<.short, _d<.java.awt.image.renderable.ParameterBlock |
_a<.javax.swing.AbstractButton, _d<.javax.swing.ButtonGroup |
_a<.java.lang.String, _d<.java.awt.Choice |
_a<.java.lang.Object, _d<.javax.management.relation.RoleList |
_a<._E, _d<.java.util.concurrent.LinkedBlockingDeque |
_a<.java.awt.Rectangle, _d<.java.awt.Rectangle |
_a<._K, _d<.java.util.concurrent.ConcurrentHashMap$KeySetView |
_a<._E, _d<.java.util.concurrent.LinkedTransferQueue |
_a<.java.awt.Point, _d<.java.awt.Rectangle |
_a<._E, _d<.java.util.PriorityQueue |
_a<.java.awt.Component, _d<.javax.swing.JTabbedPane |
_a<.javax.swing.JMenuItem, _d<.javax.swing.JMenu |
_a<._E, _d<.java.util.ListIterator |
_a<._E, _d<.java.util.AbstractQueue |
_a<.java.math.BigInteger, _d<.java.math.BigInteger |
_a<.javax.print.attribute.Attribute, _d<.javax.print.attribute.DocAttributeSet |
_a<.byte, _d<.java.awt.image.renderable.ParameterBlock |
_a<._E, _d<.java.util.LinkedList |
_a<.java.awt.Component, _d<.java.awt.Container |
_a<._E, _d<.java.util.concurrent.BlockingQueue |
_a<.javax.print.attribute.Attribute, _d<.javax.print.attribute.PrintJobAttributeSet |
_a<.javax.swing.JMenu, _d<.javax.swing.JMenuBar |
_a<.java.lang.String, _d<.javax.naming.CompoundName |
_a<.javax.sound.midi.MidiEvent, _d<.javax.sound.midi.Track |
_a<.java.lang.String, _d<.java.awt.Menu |
_a<.double, _d<.java.util.stream.DoubleStream$Builder |
_a<._E, _d<.java.util.ArrayList |
_a<.javax.xml.stream.XMLEventReader, _d<.javax.xml.stream.XMLEventWriter |
_a<._E, _d<.java.util.List |
_a<.java.awt.geom.Area, _d<.java.awt.geom.Area |
_a<.long, _d<.java.awt.image.renderable.ParameterBlock |
_a<.java.lang.Object, _d<.java.awt.image.renderable.ParameterBlock |
_a<.int, _d<.java.awt.image.renderable.ParameterBlock |
_a<.java.lang.Object, _d<.javax.print.attribute.standard.JobStateReasons |
_a<.javax.naming.ldap.Rdn, _d<.javax.naming.ldap.LdapName |
_a<.java.lang.Object, _d<.javax.naming.directory.Attribute |
_a<.javax.xml.stream.events.XMLEvent, _d<.javax.xml.stream.XMLEventWriter |
_a<._E, _d<.java.util.concurrent.DelayQueue |
_a<.javax.print.attribute.standard.JobStateReason, _d<.javax.print.attribute.standard.JobStateReasons |
_a<.java.lang.Object, _d<.java.beans.beancontext.BeanContextSupport |
_a<._E, _d<.java.util.concurrent.BlockingDeque |
_a<.java.awt.Component, _d<.javax.swing.JMenu |
_a<.java.security.Permission, _d<.java.security.Permissions |
_a<._E, _d<.java.util.HashSet |
_a<.java.lang.String, _d<.javax.swing.JPopupMenu |
_a<.java.awt.PopupMenu, _d<.java.awt.Component |
_a<.java.lang.String, _d<.javax.naming.Name |
_a<._T, _d<.java.util.stream.Stream$Builder |
_a<.java.awt.MenuItem, _d<.java.awt.Menu |
_a<.javax.accessibility.AccessibleRelation, _d<.javax.accessibility.AccessibleRelationSet |
_a<.java.lang.Object, _d<.javax.management.relation.RoleUnresolvedList |
_a<.java.lang.Object, _d<.javax.naming.directory.BasicAttribute |
_a<.javax.management.Attribute, _d<.javax.management.AttributeList |
_a<.javax.management.relation.RoleUnresolved, _d<.javax.management.relation.RoleUnresolvedList |
_a<.char, _d<.java.awt.image.renderable.ParameterBlock |
_a<.javax.print.attribute.Attribute, _d<.javax.print.attribute.PrintServiceAttributeSet |
_a<.javax.swing.Action, _d<.javax.swing.JPopupMenu |
_a<._E, _d<.java.util.AbstractList |
_a<._E, _d<.java.util.concurrent.CopyOnWriteArraySet |
_a<.javax.xml.stream.events.XMLEvent, _d<.javax.xml.stream.util.XMLEventConsumer |
_a<.javax.print.attribute.Attribute, _d<.javax.print.attribute.PrintRequestAttributeSet |
_a<._E, _d<.java.util.concurrent.ConcurrentLinkedDeque |
_a<._E, _d<.java.util.concurrent.PriorityBlockingQueue |
_a<._E, _d<.java.util.concurrent.ArrayBlockingQueue |
_a<.long, _d<.java.util.stream.LongStream$Builder |
_a<.javax.swing.JMenuItem, _d<.javax.swing.JPopupMenu |
_a<.java.math.BigDecimal, _d<.java.math.BigDecimal |
_a<.javax.swing.Action, _d<.javax.swing.JToolBar |
_a<._E, _d<.java.util.concurrent.ConcurrentSkipListSet |
_a<._E, _d<.java.util.AbstractCollection |
_a<.java.lang.CharSequence, _d<.java.util.StringJoiner |
_a<.javax.naming.RefAddr, _d<.javax.naming.Reference |
_a<._E, _d<.java.util.Deque |
_a<._E, _d<.java.util.Set |
_a<.double, _d<.java.util.concurrent.atomic.DoubleAdder |
_a<.javax.swing.Action, _d<.javax.swing.JMenu |
_a<._E, _d<.java.util.Collection |
_a<.javax.xml.datatype.Duration, _d<.javax.xml.datatype.XMLGregorianCalendar |
_a<._E, _d<.java.util.Vector }
File diff suppressed because it is too large. Load diff
@@ -1,665 +0,0 @@
{ _b<.java.security.Permission, _a<.java.util.PropertyPermissionCollection |
_b<.int, _a<.sun.java2d.marlin.stats.Histogram |
_b<.java.lang.Object, _a<.com.sun.jndi.ldap.LdapAttribute |
_b<.java.math.BigInteger, _a<.java.math.BigInteger |
_b<.java.lang.Object, _a<.com.sun.org.apache.xerces.internal.impl.xs.XSModelImpl$XSNamespaceItemListIterator |
_b<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolverSpi, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_b<._E, _a<.java.util.AbstractList |
_b<._E, _a<.java.util.HashSet |
_b<.sun.security.util.math.IntegerModuloP, _a<.sun.security.util.math.intpoly.IntegerPolynomial$Element |
_b<.java.awt.geom.Point2D, _a<.java.awt.geom.Rectangle2D |
_b<._E, _a<.java.util.AbstractQueue |
_b<.double, _a<.java.util.concurrent.atomic.DoubleAdder |
_b<._E, _a<.java.util.Collections$AsLIFOQueue |
_b<.com.sun.org.apache.xml.internal.security.keys.content.keyvalues.DSAKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<._E, _a<.java.util.Collections$EmptyListIterator |
_b<._E, _a<.java.util.AbstractList$ListItr |
_b<.java.math.BigDecimal, _a<.java.math.BigDecimal |
_b<._E, _a<.java.util.Collections$CheckedList$1 |
_b<.sun.security.provider.PolicyParser$GrantEntry, _a<.sun.security.provider.PolicyParser |
_b<._T_array, _a<.sun.swing.AccumulativeRunnable |
_b<._T, _a<.com.sun.jmx.remote.internal.ArrayQueue |
_b<.javax.management.relation.Role, _a<.javax.management.relation.RoleList |
_b<.java.lang.String, _a<.javax.naming.Name |
_b<.javax.xml.datatype.Duration, _a<.javax.xml.datatype.Duration |
_b<._E, _a<.java.util.concurrent.ConcurrentSkipListSet |
_b<.javax.accessibility.AccessibleRelation, _a<.javax.accessibility.AccessibleRelationSet |
_b<.java.awt.RenderingHints, _a<.java.awt.RenderingHints |
_b<.java.lang.Object, _a<.java.util.JumboEnumSet |
_b<.javax.xml.datatype.Duration, _a<.com.sun.org.apache.xerces.internal.jaxp.datatype.DurationImpl |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSetUtilities$UnmodifiableAttributeSet |
_b<.java.awt.geom.Rectangle2D, _a<.java.awt.geom.Rectangle2D |
_b<.java.awt.TrayIcon, _a<.java.awt.SystemTray |
_b<.java.awt.Component, _a<.sun.awt.X11.InfoWindow |
_b<.javax.sound.midi.MidiEvent, _a<.javax.sound.midi.Track |
_b<.java.awt.Component, _a<.javax.swing.JMenu |
_b<.com.sun.org.apache.bcel.internal.classfile.JavaClass, _a<.com.sun.org.apache.bcel.internal.util.ClassSet |
_b<.java.awt.Component, _a<.javax.swing.JTabbedPane |
_b<.java.lang.Object, _a<.javax.management.relation.RoleList |
_b<._T, _a<.java.util.stream.Stream$Builder |
_b<._K, _a<.java.util.concurrent.ConcurrentHashMap$KeySetView |
_b<._E, _a<.sun.nio.ch.Util$2 |
_b<.char, _a<.java.awt.image.renderable.ParameterBlock |
_b<._E, _a<.java.util.concurrent.LinkedTransferQueue |
_b<.com.sun.org.apache.xml.internal.security.keys.content.KeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.com.sun.org.apache.xml.internal.security.keys.content.PGPData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.int, _a<.com.sun.org.apache.xalan.internal.xsltc.util.IntegerArray |
_b<.java.lang.Runnable, _a<.java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue |
_b<.java.awt.geom.Area, _a<.java.awt.geom.Area |
_b<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SubjectName, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_b<._E, _a<.java.util.Vector |
_b<.java.security.Permission, _a<.javax.management.MBeanServerPermissionCollection |
_b<.long, _a<.sun.java2d.xr.XcbRequestCounter |
_b<.java.lang.Object, _a<.sun.tools.jar.Main$1 |
_b<.int, _a<.sun.java2d.marlin.stats.StatLong |
_b<.java.lang.String, _a<.java.awt.List |
_b<.java.lang.String, _a<.javax.naming.CompositeName |
_b<.jdk.internal.org.objectweb.asm.tree.InsnList, _a<.jdk.internal.org.objectweb.asm.tree.InsnList |
_b<._E, _a<.sun.awt.util.IdentityArrayList |
_b<._E, _a<.javax.security.auth.Subject$SecureSet |
_b<._E, _a<.java.util.JumboEnumSet |
_b<._E, _a<.java.util.PriorityQueue |
_b<.com.sun.org.apache.xml.internal.security.keys.content.DEREncodedKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.javax.swing.AbstractButton, _a<.javax.swing.ButtonGroup |
_b<.int, _a<.java.util.stream.IntStream$Builder |
_b<.java.lang.String, _a<.javax.swing.JMenu |
_b<.com.sun.org.apache.xml.internal.security.keys.content.MgmtData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.javax.xml.stream.XMLEventReader, _a<.com.sun.xml.internal.stream.writers.XMLEventWriterImpl |
_b<.java.lang.Object, _a<.javax.management.AttributeList |
_b<._E, _a<.java.util.RegularEnumSet |
_b<._E, _a<.java.util.Collections$CheckedCollection |
_b<._T, _a<.javax.security.auth.Subject$ClassSet |
_b<.java.security.Permission, _a<.java.security.PermissionCollection |
_b<.jdk.internal.org.objectweb.asm.tree.AbstractInsnNode, _a<.jdk.internal.org.objectweb.asm.tree.InsnList |
_b<.java.lang.Object, _a<.com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl$XSObjectListIterator |
_b<.java.security.Permission, _a<.java.security.PermissionsHash |
_b<.java.lang.Object, _a<.java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue |
_b<.double, _a<.java.util.stream.DoubleStream$Builder |
_b<.com.sun.org.apache.xml.internal.security.keys.content.keyvalues.RSAKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.long, _a<.sun.java2d.marlin.stats.StatLong |
_b<.javax.xml.datatype.Duration, _a<.com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl |
_b<.java.security.Permission, _a<.java.security.AllPermissionCollection |
_b<.sun.awt.X11.XAtom, _a<.sun.awt.X11.XAtomList |
_b<.javax.swing.Action, _a<.javax.swing.JPopupMenu |
_b<.java.lang.Object, _a<.java.util.Hashtable$EntrySet |
_b<.java.security.Permission, _a<.java.security.UnresolvedPermissionCollection |
_b<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509Digest, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_b<.javax.management.relation.RoleUnresolved, _a<.javax.management.relation.RoleUnresolvedList |
_b<.java.lang.Object, _a<.javax.print.attribute.standard.JobStateReasons |
_b<._E, _a<.java.util.Collections$UnmodifiableList$1 |
_b<._E, _a<.java.util.Deque |
_b<._E, _a<.java.util.Collection |
_b<._E, _a<.javax.imageio.spi.PartiallyOrderedSet |
_b<.sun.security.x509.GeneralSubtree, _a<.sun.security.x509.GeneralSubtrees |
_b<.long, _a<.java.util.concurrent.atomic.LongAdder |
_b<.java.awt.Menu, _a<.java.awt.MenuBar |
_b<.com.sun.org.apache.xml.internal.security.keys.content.X509Data, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.java.awt.Point, _a<.java.awt.Rectangle |
_b<.java.security.Permission, _a<.javax.security.auth.kerberos.KrbDelegationPermissionCollection |
_b<.javax.xml.stream.events.XMLEvent, _a<.javax.xml.stream.XMLEventWriter |
_b<.com.sun.org.apache.xml.internal.security.keys.content.KeyInfoReference, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintJobAttributeSet |
_b<.com.sun.org.apache.xml.internal.security.keys.content.SPKIData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.java.security.Permission, _a<.java.security.BasicPermissionCollection |
_b<._E, _a<.java.util.concurrent.BlockingDeque |
_b<.sun.net.httpserver.HttpContextImpl, _a<.sun.net.httpserver.ContextList |
_b<._E, _a<.java.util.concurrent.ConcurrentLinkedDeque |
_b<._E, _a<.java.util.Collections$SetFromMap |
_b<.javax.swing.JMenuItem, _a<.javax.swing.JPopupMenu |
_b<.java.awt.MenuItem, _a<.java.awt.Menu |
_b<.java.lang.Object, _a<.java.beans.beancontext.BeanContextSupport |
_b<.java.lang.String, _a<.com.sun.org.apache.xerces.internal.dom.DOMStringListImpl |
_b<.short, _a<.com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$ShortVector |
_b<.javax.xml.stream.XMLEventReader, _a<.javax.xml.stream.XMLEventWriter |
_b<.java.lang.String, _a<.com.sun.jndi.dns.DnsName |
_b<._E, _a<.java.util.ListIterator |
_b<._E, _a<.java.util.LinkedList |
_b<.long, _a<.sun.java2d.marlin.stats.Histogram |
_b<._E, _a<.java.util.concurrent.DelayQueue |
_b<.java.security.Permission, _a<.java.net.SocketPermissionCollection |
_b<.java.security.Permission, _a<.java.security.Policy$UnsupportedEmptyCollection |
_b<._E, _a<.java.util.concurrent.CopyOnWriteArrayList |
_b<.java.lang.String, _a<.javax.naming.CompoundName |
_b<._E, _a<.java.util.List |
_b<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWIterator |
_b<.javax.swing.JMenuItem, _a<.javax.swing.JMenu |
_b<.java.security.Permission, _a<.java.security.Permissions |
_b<.java.security.KeyStore, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_b<.long, _a<.java.util.stream.LongStream$Builder |
_b<._E, _a<.java.util.AbstractCollection |
_b<.[Lcom.sun.media.sound.ModelPerformer;, _a<.com.sun.media.sound.SimpleInstrument |
_b<.java.security.cert.X509Certificate, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_b<._E, _a<.java.util.concurrent.PriorityBlockingQueue |
_b<.com.sun.org.apache.xerces.internal.xs.XSObject, _a<.com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl$XSObjectListIterator |
_b<.java.lang.CharSequence, _a<.java.util.StringJoiner |
_b<._E, _a<.java.util.concurrent.ArrayBlockingQueue |
_b<.javax.swing.JMenu, _a<.javax.swing.JMenuBar |
_b<.java.lang.Object, _a<.java.util.RegularEnumSet |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSetUtilities$SynchronizedAttributeSet |
_b<.java.lang.String, _a<.javax.swing.JPopupMenu |
_b<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509Certificate, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_b<._E, _a<.java.util.ArrayList$ListItr |
_b<.com.sun.org.apache.xml.internal.security.keys.content.KeyName, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.javax.accessibility.AccessibleState, _a<.javax.accessibility.AccessibleStateSet |
_b<.javax.naming.RefAddr, _a<.javax.naming.Reference |
_b<.java.lang.String, _a<.javax.naming.NameImpl |
_b<.javax.xml.stream.events.XMLEvent, _a<.javax.xml.stream.util.XMLEventConsumer |
_b<.sun.security.util.math.IntegerModuloP, _a<.sun.security.util.math.IntegerModuloP |
_b<._E, _a<.java.util.ArrayList |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintServiceAttributeSet |
_b<.java.lang.Object, _a<.javax.naming.directory.BasicAttribute |
_b<._E, _a<.java.util.concurrent.ConcurrentLinkedQueue |
_b<.int, _a<.java.io.ObjectInputStream$HandleTable$HandleList |
_b<.java.lang.String, _a<.java.awt.Choice |
_b<.java.lang.Object, _a<.javax.management.relation.RoleUnresolvedList |
_b<.com.sun.org.apache.bcel.internal.generic.InstructionHandle, _a<.com.sun.org.apache.xalan.internal.xsltc.compiler.FlowList |
_b<.java.io.File, _a<.sun.font.CreatedFontTracker |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.HashAttributeSet |
_b<._E, _a<.java.util.LinkedList$ListItr |
_b<.javax.naming.ldap.Rdn, _a<.javax.naming.ldap.LdapName |
_b<.jdk.internal.org.objectweb.asm.Type, _a<.jdk.internal.org.objectweb.asm.commons.InstructionAdapter |
_b<._E, _a<.java.util.Set |
_b<.java.security.Permission, _a<.javax.security.auth.kerberos.KrbServicePermissionCollection |
_b<.com.sun.org.apache.xml.internal.security.keys.content.RetrievalMethod, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.short, _a<.java.awt.image.renderable.ParameterBlock |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintRequestAttributeSet |
_b<.float, _a<.java.awt.image.renderable.ParameterBlock |
_b<._E, _a<.java.util.concurrent.LinkedBlockingDeque |
_b<.javax.swing.Action, _a<.javax.swing.JToolBar |
_b<.java.lang.String, _a<.javax.naming.ldap.LdapName |
_b<._E, _a<.java.util.Collections$SynchronizedCollection |
_b<._E, _a<.java.util.Queue |
_b<.javax.swing.Action, _a<.javax.swing.JMenu |
_b<.java.awt.Component, _a<.java.awt.Container |
_b<._E, _a<.java.util.TreeSet |
_b<.javax.xml.stream.events.XMLEvent, _a<.com.sun.xml.internal.stream.writers.XMLEventWriterImpl |
_b<.java.security.PublicKey, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.java.awt.PopupMenu, _a<.java.awt.Component |
_b<.com.sun.org.apache.xerces.internal.xs.XSNamespaceItem, _a<.com.sun.org.apache.xerces.internal.impl.xs.XSModelImpl$XSNamespaceItemListIterator |
_b<.int, _a<.java.awt.image.renderable.ParameterBlock |
_b<.sun.net.www.MimeEntry, _a<.sun.net.www.MimeTable |
_b<._E, _a<.java.util.concurrent.CopyOnWriteArraySet |
_b<.java.awt.Rectangle, _a<.java.awt.Rectangle |
_b<.java.lang.String, _a<.com.sun.jndi.ldap.LdapName |
_b<._E, _a<.java.util.Collections$UnmodifiableCollection |
_b<.javax.swing.GroupLayout$ComponentInfo, _a<.javax.swing.GroupLayout$LinkInfo |
_b<._E, _a<.java.util.Vector$ListItr |
_b<.long, _a<.java.awt.image.renderable.ParameterBlock |
_b<._E, _a<.java.util.concurrent.BlockingQueue |
_b<._T, _a<.java.util.stream.Streams$StreamBuilderImpl |
_b<.byte, _a<.java.awt.image.renderable.ParameterBlock |
_b<.sun.awt.DisplayChangedListener, _a<.sun.awt.SunDisplayChanger |
_b<.com.sun.media.sound.ModelPerformer, _a<.com.sun.media.sound.SimpleInstrument |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.DocAttributeSet |
_b<._V, _a<.java.util.concurrent.ConcurrentHashMap$ValuesView |
_b<.com.sun.media.sound.ModelInstrument, _a<.com.sun.media.sound.SimpleInstrument |
_b<.java.lang.Object, _a<.java.util.concurrent.DelayQueue |
_b<.sun.security.x509.GeneralName, _a<.sun.security.x509.GeneralNames |
_b<.sun.security.provider.PolicyParser$PermissionEntry, _a<.sun.security.provider.PolicyParser$GrantEntry |
_b<._E, _a<.java.util.ArrayList$SubList$1 |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSet |
_b<.java.lang.Object, _a<.javax.naming.directory.Attribute |
_b<.java.lang.Object, _a<.jdk.internal.org.objectweb.asm.tree.MethodNode$1 |
_b<.java.security.Permission, _a<.java.io.FilePermissionCollection |
_b<.java.util.zip.ZipEntry, _a<.sun.tools.jar.Main$1 |
_b<.java.lang.String, _a<.java.awt.Menu |
_b<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWSubList |
_b<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SKI, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_b<.javax.xml.datatype.Duration, _a<.javax.xml.datatype.XMLGregorianCalendar |
_b<.java.lang.Object, _a<.java.util.concurrent.ConcurrentHashMap$EntrySetView |
_b<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509IssuerSerial, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_b<.javax.swing.tree.MutableTreeNode, _a<.javax.swing.tree.DefaultMutableTreeNode |
_b<.sun.awt.image.ImageFetchable, _a<.sun.awt.image.ImageFetcher |
_b<.javax.management.Attribute, _a<.javax.management.AttributeList |
_b<.double, _a<.java.awt.image.renderable.ParameterBlock |
_b<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWSubListIterator |
_b<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509CRL, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_b<.java.lang.Object, _a<.jdk.internal.org.objectweb.asm.tree.InsnList$InsnListIterator |
_b<.java.lang.Object, _a<.java.util.Collections$CheckedMap$CheckedEntrySet |
_b<.java.lang.Object, _a<.java.awt.image.renderable.ParameterBlock |
_b<.javax.print.attribute.standard.JobStateReason, _a<.javax.print.attribute.standard.JobStateReasons |
_b<._E, _a<.java.util.ArrayDeque }
{ _c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.HashAttributeSet |
_c<.javax.swing.GroupLayout$ComponentInfo, _a<.javax.swing.GroupLayout$LinkInfo |
_c<._E, _a<.java.util.ArrayList$SubList$1 |
_c<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SKI, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_c<.java.lang.Object, _a<.java.util.concurrent.ConcurrentHashMap$EntrySetView |
_c<._E, _a<.java.util.Set |
_c<._E, _a<.java.util.ArrayList$ListItr |
_c<.java.awt.geom.Point2D, _a<.java.awt.geom.Rectangle2D |
_c<.javax.xml.datatype.Duration, _a<.com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl |
_c<.int, _a<.java.awt.image.renderable.ParameterBlock |
_c<.java.security.Permission, _a<.java.util.PropertyPermissionCollection |
_c<.javax.swing.Action, _a<.javax.swing.JMenu |
_c<.com.sun.org.apache.xml.internal.security.keys.content.SPKIData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<._E, _a<.java.util.concurrent.ConcurrentSkipListSet |
_c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSetUtilities$UnmodifiableAttributeSet |
_c<.java.util.zip.ZipEntry, _a<.sun.tools.jar.Main$1 |
_c<.java.security.Permission, _a<.javax.management.MBeanServerPermissionCollection |
_c<.java.security.Permission, _a<.java.security.UnresolvedPermissionCollection |
_c<._V, _a<.java.util.concurrent.ConcurrentHashMap$ValuesView |
_c<.int, _a<.sun.java2d.marlin.stats.StatLong |
_c<._E, _a<.java.util.Collections$CheckedList$1 |
_c<.java.lang.String, _a<.javax.naming.Name |
_c<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolverSpi, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSet |
_c<.javax.management.relation.RoleUnresolved, _a<.javax.management.relation.RoleUnresolvedList |
_c<.java.awt.Component, _a<.javax.swing.JMenu |
_c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintJobAttributeSet |
_c<._E, _a<.java.util.ArrayList |
_c<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SubjectName, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_c<.java.lang.Object, _a<.javax.print.attribute.standard.JobStateReasons |
_c<.char, _a<.java.awt.image.renderable.ParameterBlock |
_c<.java.awt.Point, _a<.java.awt.Rectangle |
_c<.javax.management.relation.Role, _a<.javax.management.relation.RoleList |
_c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintServiceAttributeSet |
_c<._E, _a<.java.util.Vector$ListItr |
_c<.javax.xml.datatype.Duration, _a<.javax.xml.datatype.XMLGregorianCalendar |
_c<.javax.swing.Action, _a<.javax.swing.JPopupMenu |
_c<.long, _a<.java.util.concurrent.atomic.LongAdder |
_c<.sun.security.util.math.IntegerModuloP, _a<.sun.security.util.math.intpoly.IntegerPolynomial$Element |
_c<.java.awt.TrayIcon, _a<.java.awt.SystemTray |
_c<.java.lang.Object, _a<.javax.management.AttributeList |
_c<.java.lang.String, _a<.javax.naming.CompositeName |
_c<.short, _a<.com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$ShortVector |
_c<.com.sun.org.apache.xerces.internal.xs.XSObject, _a<.com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl$XSObjectListIterator |
_c<._T, _a<.javax.security.auth.Subject$ClassSet |
_c<.sun.security.provider.PolicyParser$GrantEntry, _a<.sun.security.provider.PolicyParser |
_c<._K, _a<.java.util.concurrent.ConcurrentHashMap$KeySetView |
_c<.[Lcom.sun.media.sound.ModelPerformer;, _a<.com.sun.media.sound.SimpleInstrument |
_c<.java.awt.Component, _a<.java.awt.Container |
_c<.java.lang.Object, _a<.javax.naming.directory.BasicAttribute |
_c<._E, _a<.java.util.LinkedList |
_c<._E, _a<.sun.awt.util.IdentityArrayList |
_c<.javax.naming.ldap.Rdn, _a<.javax.naming.ldap.LdapName |
_c<.double, _a<.java.awt.image.renderable.ParameterBlock |
_c<._E, _a<.java.util.Collections$AsLIFOQueue |
_c<.com.sun.org.apache.xml.internal.security.keys.content.MgmtData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<._E, _a<.java.util.Collections$SetFromMap |
_c<.java.lang.String, _a<.com.sun.jndi.dns.DnsName |
_c<.java.lang.Object, _a<.javax.management.relation.RoleUnresolvedList |
_c<.sun.security.x509.GeneralName, _a<.sun.security.x509.GeneralNames |
_c<.sun.awt.X11.XAtom, _a<.sun.awt.X11.XAtomList |
_c<.javax.xml.stream.XMLEventReader, _a<.com.sun.xml.internal.stream.writers.XMLEventWriterImpl |
_c<.java.lang.Object, _a<.com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl$XSObjectListIterator |
_c<.java.lang.Object, _a<.java.util.JumboEnumSet |
_c<._E, _a<.java.util.AbstractList$ListItr |
_c<.javax.xml.datatype.Duration, _a<.javax.xml.datatype.Duration |
_c<.javax.swing.JMenuItem, _a<.javax.swing.JPopupMenu |
_c<.java.lang.Object, _a<.com.sun.org.apache.xerces.internal.impl.xs.XSModelImpl$XSNamespaceItemListIterator |
_c<.java.lang.String, _a<.com.sun.jndi.ldap.LdapName |
_c<.java.security.KeyStore, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_c<.java.math.BigDecimal, _a<.java.math.BigDecimal |
_c<.short, _a<.java.awt.image.renderable.ParameterBlock |
_c<.float, _a<.java.awt.image.renderable.ParameterBlock |
_c<.java.security.Permission, _a<.java.security.PermissionCollection |
_c<._E, _a<.javax.security.auth.Subject$SecureSet |
_c<.java.awt.PopupMenu, _a<.java.awt.Component |
_c<.java.awt.Rectangle, _a<.java.awt.Rectangle |
_c<.com.sun.media.sound.ModelPerformer, _a<.com.sun.media.sound.SimpleInstrument |
_c<.javax.swing.Action, _a<.javax.swing.JToolBar |
_c<._E, _a<.java.util.concurrent.ConcurrentLinkedDeque |
_c<._E, _a<.java.util.Collections$UnmodifiableCollection |
_c<._E, _a<.java.util.Queue |
_c<.java.lang.String, _a<.javax.naming.ldap.LdapName |
_c<.java.lang.Runnable, _a<.java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue |
_c<.jdk.internal.org.objectweb.asm.tree.InsnList, _a<.jdk.internal.org.objectweb.asm.tree.InsnList |
_c<.sun.net.www.MimeEntry, _a<.sun.net.www.MimeTable |
_c<.com.sun.org.apache.xml.internal.security.keys.content.keyvalues.DSAKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<.java.awt.Menu, _a<.java.awt.MenuBar |
_c<._E, _a<.java.util.ArrayDeque |
_c<._E, _a<.java.util.List |
_c<._E, _a<.java.util.JumboEnumSet |
_c<.java.io.File, _a<.sun.font.CreatedFontTracker |
_c<.sun.net.httpserver.HttpContextImpl, _a<.sun.net.httpserver.ContextList |
_c<._E, _a<.java.util.AbstractQueue |
_c<.double, _a<.java.util.concurrent.atomic.DoubleAdder |
_c<.javax.print.attribute.standard.JobStateReason, _a<.javax.print.attribute.standard.JobStateReasons |
_c<.java.awt.RenderingHints, _a<.java.awt.RenderingHints |
_c<.long, _a<.java.awt.image.renderable.ParameterBlock |
_c<._E, _a<.java.util.concurrent.PriorityBlockingQueue |
_c<._E, _a<.java.util.AbstractList |
_c<.java.security.Permission, _a<.javax.security.auth.kerberos.KrbServicePermissionCollection |
_c<.java.awt.geom.Rectangle2D, _a<.java.awt.geom.Rectangle2D |
_c<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509IssuerSerial, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_c<.java.lang.Object, _a<.javax.management.relation.RoleList |
_c<.double, _a<.java.util.stream.DoubleStream$Builder |
_c<._E, _a<.java.util.AbstractCollection |
_c<.byte, _a<.java.awt.image.renderable.ParameterBlock |
_c<.java.security.Permission, _a<.java.net.SocketPermissionCollection |
_c<.javax.naming.RefAddr, _a<.javax.naming.Reference |
_c<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509Certificate, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_c<.java.lang.Object, _a<.java.util.Collections$CheckedMap$CheckedEntrySet |
_c<._E, _a<.java.util.TreeSet |
_c<.java.security.Permission, _a<.java.io.FilePermissionCollection |
_c<.java.security.Permission, _a<.java.security.Policy$UnsupportedEmptyCollection |
_c<._E, _a<.java.util.Collections$SynchronizedCollection |
_c<._E, _a<.java.util.Collections$UnmodifiableList$1 |
_c<.com.sun.org.apache.xml.internal.security.keys.content.X509Data, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<._E, _a<.sun.nio.ch.Util$2 |
_c<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWSubListIterator |
_c<.java.security.Permission, _a<.java.security.Permissions |
_c<._E, _a<.java.util.Collections$CheckedCollection |
_c<.sun.security.util.math.IntegerModuloP, _a<.sun.security.util.math.IntegerModuloP |
_c<._E, _a<.java.util.Deque |
_c<._E, _a<.java.util.LinkedList$ListItr |
_c<.java.lang.String, _a<.java.awt.Choice |
_c<._E, _a<.java.util.concurrent.ConcurrentLinkedQueue |
_c<._E, _a<.java.util.Vector |
_c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.DocAttributeSet |
_c<.java.lang.Object, _a<.java.beans.beancontext.BeanContextSupport |
_c<._E, _a<.javax.imageio.spi.PartiallyOrderedSet |
_c<.java.lang.String, _a<.javax.naming.NameImpl |
_c<._E, _a<.java.util.concurrent.LinkedBlockingDeque |
_c<.java.lang.String, _a<.java.awt.List |
_c<._E, _a<.java.util.concurrent.DelayQueue |
_c<.java.lang.Object, _a<.jdk.internal.org.objectweb.asm.tree.InsnList$InsnListIterator |
_c<.javax.swing.AbstractButton, _a<.javax.swing.ButtonGroup |
_c<.java.security.PublicKey, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509Digest, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_c<.java.awt.Component, _a<.javax.swing.JTabbedPane |
_c<.java.lang.Object, _a<.java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue |
_c<.long, _a<.sun.java2d.marlin.stats.Histogram |
_c<._E, _a<.java.util.concurrent.BlockingQueue |
_c<.jdk.internal.org.objectweb.asm.tree.AbstractInsnNode, _a<.jdk.internal.org.objectweb.asm.tree.InsnList |
_c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSetUtilities$SynchronizedAttributeSet |
_c<.java.lang.Object, _a<.java.util.concurrent.DelayQueue |
_c<.java.security.Permission, _a<.java.security.PermissionsHash |
_c<.javax.swing.JMenu, _a<.javax.swing.JMenuBar |
_c<.long, _a<.java.util.stream.LongStream$Builder |
_c<.javax.accessibility.AccessibleState, _a<.javax.accessibility.AccessibleStateSet |
_c<.javax.xml.stream.XMLEventReader, _a<.javax.xml.stream.XMLEventWriter |
_c<.long, _a<.sun.java2d.xr.XcbRequestCounter |
_c<.java.security.Permission, _a<.javax.security.auth.kerberos.KrbDelegationPermissionCollection |
_c<.com.sun.org.apache.bcel.internal.classfile.JavaClass, _a<.com.sun.org.apache.bcel.internal.util.ClassSet |
_c<.java.awt.geom.Area, _a<.java.awt.geom.Area |
_c<.com.sun.org.apache.xml.internal.security.keys.content.KeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWIterator |
_c<.sun.awt.DisplayChangedListener, _a<.sun.awt.SunDisplayChanger |
_c<._T, _a<.java.util.stream.Streams$StreamBuilderImpl |
_c<.java.lang.String, _a<.javax.naming.CompoundName |
_c<._E, _a<.java.util.Collections$EmptyListIterator |
_c<.sun.security.provider.PolicyParser$PermissionEntry, _a<.sun.security.provider.PolicyParser$GrantEntry |
_c<.java.lang.Object, _a<.javax.naming.directory.Attribute |
_c<._E, _a<.java.util.ListIterator |
_c<.java.security.Permission, _a<.java.security.AllPermissionCollection |
_c<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWSubList |
_c<.java.lang.String, _a<.javax.swing.JPopupMenu |
_c<.sun.security.x509.GeneralSubtree, _a<.sun.security.x509.GeneralSubtrees |
_c<.java.lang.Object, _a<.java.util.Hashtable$EntrySet |
_c<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509CRL, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_c<.javax.xml.stream.events.XMLEvent, _a<.com.sun.xml.internal.stream.writers.XMLEventWriterImpl |
_c<.javax.xml.datatype.Duration, _a<.com.sun.org.apache.xerces.internal.jaxp.datatype.DurationImpl |
_c<.javax.swing.tree.MutableTreeNode, _a<.javax.swing.tree.DefaultMutableTreeNode |
_c<.com.sun.org.apache.xml.internal.security.keys.content.DEREncodedKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<._E, _a<.java.util.concurrent.BlockingDeque |
_c<.long, _a<.sun.java2d.marlin.stats.StatLong |
_c<.java.math.BigInteger, _a<.java.math.BigInteger |
_c<._E, _a<.java.util.concurrent.CopyOnWriteArrayList |
_c<.java.security.cert.X509Certificate, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_c<._E, _a<.java.util.concurrent.CopyOnWriteArraySet |
_c<.javax.management.Attribute, _a<.javax.management.AttributeList |
_c<.java.lang.Object, _a<.java.util.RegularEnumSet |
_c<.java.lang.String, _a<.javax.swing.JMenu |
_c<.java.lang.Object, _a<.com.sun.jndi.ldap.LdapAttribute |
_c<.javax.xml.stream.events.XMLEvent, _a<.javax.xml.stream.util.XMLEventConsumer |
_c<.java.lang.String, _a<.com.sun.org.apache.xerces.internal.dom.DOMStringListImpl |
_c<.java.security.Permission, _a<.java.security.BasicPermissionCollection |
_c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintRequestAttributeSet |
_c<._E, _a<.java.util.concurrent.LinkedTransferQueue |
_c<.java.lang.Object, _a<.sun.tools.jar.Main$1 |
_c<._E, _a<.java.util.RegularEnumSet |
_c<.sun.awt.image.ImageFetchable, _a<.sun.awt.image.ImageFetcher |
_c<.java.lang.Object, _a<.java.awt.image.renderable.ParameterBlock |
_c<.com.sun.org.apache.xml.internal.security.keys.content.PGPData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<.javax.xml.stream.events.XMLEvent, _a<.javax.xml.stream.XMLEventWriter |
_c<.java.awt.MenuItem, _a<.java.awt.Menu |
_c<.com.sun.org.apache.xerces.internal.xs.XSNamespaceItem, _a<.com.sun.org.apache.xerces.internal.impl.xs.XSModelImpl$XSNamespaceItemListIterator |
_c<.javax.accessibility.AccessibleRelation, _a<.javax.accessibility.AccessibleRelationSet |
_c<.com.sun.org.apache.xml.internal.security.keys.content.keyvalues.RSAKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<.int, _a<.java.util.stream.IntStream$Builder |
_c<.java.lang.Object, _a<.jdk.internal.org.objectweb.asm.tree.MethodNode$1 |
_c<.int, _a<.com.sun.org.apache.xalan.internal.xsltc.util.IntegerArray |
_c<.com.sun.media.sound.ModelInstrument, _a<.com.sun.media.sound.SimpleInstrument |
_c<.com.sun.org.apache.xml.internal.security.keys.content.RetrievalMethod, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<._T, _a<.java.util.stream.Stream$Builder |
_c<.jdk.internal.org.objectweb.asm.Type, _a<.jdk.internal.org.objectweb.asm.commons.InstructionAdapter |
_c<._E, _a<.java.util.PriorityQueue |
_c<.java.lang.String, _a<.java.awt.Menu |
_c<.int, _a<.sun.java2d.marlin.stats.Histogram |
_c<.int, _a<.java.io.ObjectInputStream$HandleTable$HandleList |
_c<.javax.swing.JMenuItem, _a<.javax.swing.JMenu |
_c<._E, _a<.java.util.HashSet |
_c<._E, _a<.java.util.concurrent.ArrayBlockingQueue |
_c<.javax.sound.midi.MidiEvent, _a<.javax.sound.midi.Track |
_c<.java.lang.CharSequence, _a<.java.util.StringJoiner |
_c<.com.sun.org.apache.xml.internal.security.keys.content.KeyInfoReference, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<.com.sun.org.apache.xml.internal.security.keys.content.KeyName, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<.com.sun.org.apache.bcel.internal.generic.InstructionHandle, _a<.com.sun.org.apache.xalan.internal.xsltc.compiler.FlowList |
_c<.java.awt.Component, _a<.sun.awt.X11.InfoWindow |
_c<._E, _a<.java.util.Collection |
_c<._T_array, _a<.sun.swing.AccumulativeRunnable |
_c<._T, _a<.com.sun.jmx.remote.internal.ArrayQueue }
{ _d<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SubjectName, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_d<._E, _a<.java.util.Collections$SetFromMap |
_d<.javax.swing.JMenuItem, _a<.javax.swing.JPopupMenu |
_d<.int, _a<.java.util.stream.IntStream$Builder |
_d<.java.awt.RenderingHints, _a<.java.awt.RenderingHints |
_d<.long, _a<.java.awt.image.renderable.ParameterBlock |
_d<.javax.accessibility.AccessibleState, _a<.javax.accessibility.AccessibleStateSet |
_d<._E, _a<.java.util.Collections$CheckedList$1 |
_d<.java.lang.Runnable, _a<.java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue |
_d<.java.lang.Object, _a<.java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue |
_d<.java.awt.geom.Point2D, _a<.java.awt.geom.Rectangle2D |
_d<.java.lang.String, _a<.javax.swing.JMenu |
_d<.java.lang.String, _a<.javax.naming.CompositeName |
_d<._E, _a<.java.util.AbstractQueue |
_d<.java.lang.String, _a<.com.sun.org.apache.xerces.internal.dom.DOMStringListImpl |
_d<.java.lang.String, _a<.java.awt.List |
_d<._E, _a<.java.util.Collection |
_d<.int, _a<.com.sun.org.apache.xalan.internal.xsltc.util.IntegerArray |
_d<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWIterator |
_d<.java.lang.Object, _a<.java.util.RegularEnumSet |
_d<.com.sun.org.apache.xerces.internal.xs.XSNamespaceItem, _a<.com.sun.org.apache.xerces.internal.impl.xs.XSModelImpl$XSNamespaceItemListIterator |
_d<.char, _a<.java.awt.image.renderable.ParameterBlock |
_d<.java.lang.String, _a<.javax.naming.CompoundName |
_d<.java.security.Permission, _a<.java.util.PropertyPermissionCollection |
_d<.[Lcom.sun.media.sound.ModelPerformer;, _a<.com.sun.media.sound.SimpleInstrument |
_d<.java.awt.Component, _a<.java.awt.Container |
_d<.sun.awt.image.ImageFetchable, _a<.sun.awt.image.ImageFetcher |
_d<._E, _a<.java.util.LinkedList |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSetUtilities$UnmodifiableAttributeSet |
_d<.java.lang.CharSequence, _a<.java.util.StringJoiner |
_d<.java.security.Permission, _a<.java.security.UnresolvedPermissionCollection |
_d<.java.lang.Object, _a<.com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl$XSObjectListIterator |
_d<.jdk.internal.org.objectweb.asm.Type, _a<.jdk.internal.org.objectweb.asm.commons.InstructionAdapter |
_d<.java.util.zip.ZipEntry, _a<.sun.tools.jar.Main$1 |
_d<._E, _a<.java.util.Collections$UnmodifiableCollection |
_d<.javax.management.relation.Role, _a<.javax.management.relation.RoleList |
_d<.javax.management.Attribute, _a<.javax.management.AttributeList |
_d<._T, _a<.java.util.stream.Stream$Builder |
_d<.java.security.Permission, _a<.javax.security.auth.kerberos.KrbServicePermissionCollection |
_d<.com.sun.org.apache.bcel.internal.generic.InstructionHandle, _a<.com.sun.org.apache.xalan.internal.xsltc.compiler.FlowList |
_d<.javax.naming.ldap.Rdn, _a<.javax.naming.ldap.LdapName |
_d<.long, _a<.java.util.concurrent.atomic.LongAdder |
_d<.java.lang.Object, _a<.javax.management.relation.RoleList |
_d<._E, _a<.java.util.concurrent.LinkedTransferQueue |
_d<.java.security.Permission, _a<.java.security.PermissionsHash |
_d<.java.lang.Object, _a<.jdk.internal.org.objectweb.asm.tree.InsnList$InsnListIterator |
_d<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509Certificate, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_d<.java.lang.String, _a<.com.sun.jndi.dns.DnsName |
_d<.javax.xml.stream.events.XMLEvent, _a<.com.sun.xml.internal.stream.writers.XMLEventWriterImpl |
_d<.java.awt.Component, _a<.javax.swing.JMenu |
_d<._E, _a<.java.util.TreeSet |
_d<.java.awt.Menu, _a<.java.awt.MenuBar |
_d<.int, _a<.java.io.ObjectInputStream$HandleTable$HandleList |
_d<.sun.security.x509.GeneralName, _a<.sun.security.x509.GeneralNames |
_d<.javax.swing.Action, _a<.javax.swing.JMenu |
_d<.com.sun.org.apache.bcel.internal.classfile.JavaClass, _a<.com.sun.org.apache.bcel.internal.util.ClassSet |
_d<.short, _a<.com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$ShortVector |
_d<._E, _a<.java.util.Collections$CheckedCollection |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSetUtilities$SynchronizedAttributeSet |
_d<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509Digest, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_d<._E, _a<.java.util.concurrent.LinkedBlockingDeque |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.HashAttributeSet |
_d<.java.security.PublicKey, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<._E, _a<.java.util.Deque |
_d<._E, _a<.java.util.PriorityQueue |
_d<.double, _a<.java.util.stream.DoubleStream$Builder |
_d<.sun.awt.DisplayChangedListener, _a<.sun.awt.SunDisplayChanger |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSet |
_d<.sun.security.provider.PolicyParser$PermissionEntry, _a<.sun.security.provider.PolicyParser$GrantEntry |
_d<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509CRL, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_d<._E, _a<.java.util.AbstractCollection |
_d<.javax.xml.stream.events.XMLEvent, _a<.javax.xml.stream.util.XMLEventConsumer |
_d<._E, _a<.java.util.concurrent.BlockingDeque |
_d<.javax.xml.datatype.Duration, _a<.javax.xml.datatype.XMLGregorianCalendar |
_d<._E, _a<.java.util.concurrent.ConcurrentLinkedQueue |
_d<.java.security.Permission, _a<.java.security.Permissions |
_d<.java.lang.Object, _a<.java.util.concurrent.ConcurrentHashMap$EntrySetView |
_d<._E, _a<.java.util.AbstractList |
_d<.int, _a<.sun.java2d.marlin.stats.Histogram |
_d<.java.io.File, _a<.sun.font.CreatedFontTracker |
_d<.java.lang.Object, _a<.java.util.JumboEnumSet |
_d<._T, _a<.java.util.stream.Streams$StreamBuilderImpl |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintServiceAttributeSet |
_d<._E, _a<.java.util.ArrayList |
_d<.javax.accessibility.AccessibleRelation, _a<.javax.accessibility.AccessibleRelationSet |
_d<.double, _a<.java.awt.image.renderable.ParameterBlock |
_d<._E, _a<.java.util.Vector$ListItr |
_d<.java.awt.Component, _a<.javax.swing.JTabbedPane |
_d<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SKI, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_d<.javax.swing.GroupLayout$ComponentInfo, _a<.javax.swing.GroupLayout$LinkInfo |
_d<._E, _a<.sun.nio.ch.Util$2 |
_d<._E, _a<.java.util.Vector |
_d<.java.lang.Object, _a<.javax.naming.directory.Attribute |
_d<.com.sun.org.apache.xerces.internal.xs.XSObject, _a<.com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl$XSObjectListIterator |
_d<.sun.net.httpserver.HttpContextImpl, _a<.sun.net.httpserver.ContextList |
_d<.java.lang.Object, _a<.sun.tools.jar.Main$1 |
_d<.com.sun.org.apache.xml.internal.security.keys.content.keyvalues.RSAKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<._E, _a<.java.util.concurrent.CopyOnWriteArraySet |
_d<.com.sun.org.apache.xml.internal.security.keys.content.KeyInfoReference, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<._E, _a<.java.util.JumboEnumSet |
_d<._V, _a<.java.util.concurrent.ConcurrentHashMap$ValuesView |
_d<.javax.xml.stream.XMLEventReader, _a<.javax.xml.stream.XMLEventWriter |
_d<._E, _a<.java.util.AbstractList$ListItr |
_d<.javax.swing.Action, _a<.javax.swing.JToolBar |
_d<.java.lang.String, _a<.javax.naming.ldap.LdapName |
_d<.java.security.Permission, _a<.java.security.BasicPermissionCollection |
_d<.java.lang.Object, _a<.java.util.concurrent.DelayQueue |
_d<.jdk.internal.org.objectweb.asm.tree.InsnList, _a<.jdk.internal.org.objectweb.asm.tree.InsnList |
_d<._E, _a<.java.util.ArrayDeque |
_d<.javax.swing.AbstractButton, _a<.javax.swing.ButtonGroup |
_d<.java.math.BigInteger, _a<.java.math.BigInteger |
_d<.java.lang.String, _a<.javax.naming.NameImpl |
_d<.java.lang.Object, _a<.java.util.Collections$CheckedMap$CheckedEntrySet |
_d<._E, _a<.java.util.HashSet |
_d<.sun.security.provider.PolicyParser$GrantEntry, _a<.sun.security.provider.PolicyParser |
_d<._E, _a<.java.util.Set |
_d<._T, _a<.javax.security.auth.Subject$ClassSet |
_d<._E, _a<.java.util.Collections$SynchronizedCollection |
_d<.javax.xml.datatype.Duration, _a<.com.sun.org.apache.xerces.internal.jaxp.datatype.DurationImpl |
_d<.javax.xml.datatype.Duration, _a<.javax.xml.datatype.Duration |
_d<.java.lang.Object, _a<.jdk.internal.org.objectweb.asm.tree.MethodNode$1 |
_d<.java.lang.Object, _a<.java.beans.beancontext.BeanContextSupport |
_d<.java.math.BigDecimal, _a<.java.math.BigDecimal |
_d<.byte, _a<.java.awt.image.renderable.ParameterBlock |
_d<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWSubListIterator |
_d<._E, _a<.java.util.Collections$EmptyListIterator |
_d<.java.lang.Object, _a<.java.util.Hashtable$EntrySet |
_d<.java.security.Permission, _a<.java.io.FilePermissionCollection |
_d<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWSubList |
_d<.java.lang.Object, _a<.com.sun.org.apache.xerces.internal.impl.xs.XSModelImpl$XSNamespaceItemListIterator |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.DocAttributeSet |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintJobAttributeSet |
_d<._E, _a<.java.util.ListIterator |
_d<._E, _a<.java.util.RegularEnumSet |
_d<.java.awt.geom.Area, _a<.java.awt.geom.Area |
_d<.javax.xml.stream.events.XMLEvent, _a<.javax.xml.stream.XMLEventWriter |
_d<._E, _a<.java.util.ArrayList$ListItr |
_d<.javax.sound.midi.MidiEvent, _a<.javax.sound.midi.Track |
_d<.double, _a<.java.util.concurrent.atomic.DoubleAdder |
_d<.java.awt.Rectangle, _a<.java.awt.Rectangle |
_d<.com.sun.org.apache.xml.internal.security.keys.content.MgmtData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.com.sun.org.apache.xml.internal.security.keys.content.RetrievalMethod, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.com.sun.org.apache.xml.internal.security.keys.content.KeyName, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.java.lang.String, _a<.java.awt.Choice |
_d<.javax.management.relation.RoleUnresolved, _a<.javax.management.relation.RoleUnresolvedList |
_d<.java.lang.String, _a<.com.sun.jndi.ldap.LdapName |
_d<.sun.net.www.MimeEntry, _a<.sun.net.www.MimeTable |
_d<._E, _a<.java.util.concurrent.BlockingQueue |
_d<.javax.swing.JMenu, _a<.javax.swing.JMenuBar |
_d<.sun.awt.X11.XAtom, _a<.sun.awt.X11.XAtomList |
_d<.java.security.Permission, _a<.java.security.Policy$UnsupportedEmptyCollection |
_d<._E, _a<.javax.imageio.spi.PartiallyOrderedSet |
_d<._T, _a<.com.sun.jmx.remote.internal.ArrayQueue |
_d<.long, _a<.sun.java2d.marlin.stats.StatLong |
_d<.com.sun.media.sound.ModelPerformer, _a<.com.sun.media.sound.SimpleInstrument |
_d<.java.awt.Component, _a<.sun.awt.X11.InfoWindow |
_d<.java.lang.Object, _a<.java.awt.image.renderable.ParameterBlock |
_d<._E, _a<.java.util.Collections$UnmodifiableList$1 |
_d<.long, _a<.sun.java2d.marlin.stats.Histogram |
_d<.javax.xml.datatype.Duration, _a<.com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl |
_d<.java.awt.MenuItem, _a<.java.awt.Menu |
_d<.java.security.Permission, _a<.javax.management.MBeanServerPermissionCollection |
_d<._E, _a<.java.util.List |
_d<.javax.swing.tree.MutableTreeNode, _a<.javax.swing.tree.DefaultMutableTreeNode |
_d<._E, _a<.javax.security.auth.Subject$SecureSet |
_d<._E, _a<.java.util.concurrent.ConcurrentLinkedDeque |
_d<.java.security.cert.X509Certificate, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_d<.sun.security.util.math.IntegerModuloP, _a<.sun.security.util.math.intpoly.IntegerPolynomial$Element |
_d<.java.lang.Object, _a<.javax.naming.directory.BasicAttribute |
_d<.java.security.KeyStore, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_d<.com.sun.media.sound.ModelInstrument, _a<.com.sun.media.sound.SimpleInstrument |
_d<.java.awt.geom.Rectangle2D, _a<.java.awt.geom.Rectangle2D |
_d<._E, _a<.java.util.concurrent.ConcurrentSkipListSet |
_d<.javax.naming.RefAddr, _a<.javax.naming.Reference |
_d<.java.awt.Point, _a<.java.awt.Rectangle |
_d<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolverSpi, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_d<.com.sun.org.apache.xml.internal.security.keys.content.PGPData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.int, _a<.java.awt.image.renderable.ParameterBlock |
_d<._E, _a<.java.util.concurrent.DelayQueue |
_d<._E, _a<.java.util.concurrent.PriorityBlockingQueue |
_d<.java.security.Permission, _a<.java.security.PermissionCollection |
_d<._T_array, _a<.sun.swing.AccumulativeRunnable |
_d<.java.lang.String, _a<.javax.swing.JPopupMenu |
_d<.java.awt.TrayIcon, _a<.java.awt.SystemTray |
_d<.javax.swing.JMenuItem, _a<.javax.swing.JMenu |
_d<.long, _a<.sun.java2d.xr.XcbRequestCounter |
_d<.java.lang.String, _a<.javax.naming.Name |
_d<._E, _a<.java.util.Collections$AsLIFOQueue |
_d<._E, _a<.java.util.ArrayList$SubList$1 |
_d<.java.security.Permission, _a<.java.security.AllPermissionCollection |
_d<.com.sun.org.apache.xml.internal.security.keys.content.keyvalues.DSAKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.jdk.internal.org.objectweb.asm.tree.AbstractInsnNode, _a<.jdk.internal.org.objectweb.asm.tree.InsnList |
_d<.long, _a<.java.util.stream.LongStream$Builder |
_d<._K, _a<.java.util.concurrent.ConcurrentHashMap$KeySetView |
_d<.java.security.Permission, _a<.java.net.SocketPermissionCollection |
_d<.com.sun.org.apache.xml.internal.security.keys.content.SPKIData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.javax.print.attribute.standard.JobStateReason, _a<.javax.print.attribute.standard.JobStateReasons |
_d<._E, _a<.java.util.concurrent.ArrayBlockingQueue |
_d<.javax.swing.Action, _a<.javax.swing.JPopupMenu |
_d<.com.sun.org.apache.xml.internal.security.keys.content.X509Data, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.java.awt.PopupMenu, _a<.java.awt.Component |
_d<.java.lang.Object, _a<.com.sun.jndi.ldap.LdapAttribute |
_d<._E, _a<.java.util.LinkedList$ListItr |
_d<.sun.security.util.math.IntegerModuloP, _a<.sun.security.util.math.IntegerModuloP |
_d<._E, _a<.sun.awt.util.IdentityArrayList |
_d<.java.security.Permission, _a<.javax.security.auth.kerberos.KrbDelegationPermissionCollection |
_d<.java.lang.String, _a<.java.awt.Menu |
_d<.java.lang.Object, _a<.javax.management.relation.RoleUnresolvedList |
_d<.short, _a<.java.awt.image.renderable.ParameterBlock |
_d<.float, _a<.java.awt.image.renderable.ParameterBlock |
_d<._E, _a<.java.util.concurrent.CopyOnWriteArrayList |
_d<.java.lang.Object, _a<.javax.print.attribute.standard.JobStateReasons |
_d<.javax.xml.stream.XMLEventReader, _a<.com.sun.xml.internal.stream.writers.XMLEventWriterImpl |
_d<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509IssuerSerial, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_d<._E, _a<.java.util.Queue |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintRequestAttributeSet |
_d<.int, _a<.sun.java2d.marlin.stats.StatLong |
_d<.com.sun.org.apache.xml.internal.security.keys.content.DEREncodedKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.com.sun.org.apache.xml.internal.security.keys.content.KeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.java.lang.Object, _a<.javax.management.AttributeList |
_d<.sun.security.x509.GeneralSubtree, _a<.sun.security.x509.GeneralSubtrees }
@@ -1,651 +0,0 @@
{
_b<.java.util.Map$Entry<_K, _V>, _a<.java.util.Collections$CheckedMap$CheckedEntrySet |
_b<._E, _a<.java.util.concurrent.ConcurrentSkipListSet |
_b<.javax.accessibility.AccessibleRelation, _a<.javax.accessibility.AccessibleRelationSet |
_b<.java.awt.RenderingHints, _a<.java.awt.RenderingHints |
_b<.java.lang.Object, _a<.java.util.JumboEnumSet |
_b<.javax.xml.datatype.Duration, _a<.com.sun.org.apache.xerces.internal.jaxp.datatype.DurationImpl |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSetUtilities$UnmodifiableAttributeSet |
_b<.java.awt.geom.Rectangle2D, _a<.java.awt.geom.Rectangle2D |
_b<.java.awt.TrayIcon, _a<.java.awt.SystemTray |
_b<.java.util.Map$Entry<_K, _V>, _a<.java.util.concurrent.ConcurrentHashMap$EntrySetView |
_b<.java.awt.Component, _a<.sun.awt.X11.InfoWindow |
_b<.javax.sound.midi.MidiEvent, _a<.javax.sound.midi.Track |
_b<.java.awt.Component, _a<.javax.swing.JMenu |
_b<.com.sun.org.apache.bcel.internal.classfile.JavaClass, _a<.com.sun.org.apache.bcel.internal.util.ClassSet |
_b<.java.awt.Component, _a<.javax.swing.JTabbedPane |
_b<.java.lang.Object, _a<.javax.management.relation.RoleList |
_b<._T, _a<.java.util.stream.Stream$Builder |
_b<._K, _a<.java.util.concurrent.ConcurrentHashMap$KeySetView |
_b<._E, _a<.sun.nio.ch.Util$2 |
_b<.char, _a<.java.awt.image.renderable.ParameterBlock |
_b<._E, _a<.java.util.concurrent.LinkedTransferQueue |
_b<.com.sun.org.apache.xml.internal.security.keys.content.KeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.com.sun.org.apache.xml.internal.security.keys.content.PGPData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.int, _a<.com.sun.org.apache.xalan.internal.xsltc.util.IntegerArray |
_b<.java.lang.Runnable, _a<.java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue |
_b<.java.awt.geom.Area, _a<.java.awt.geom.Area |
_b<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SubjectName, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_b<._E, _a<.java.util.Vector |
_b<.java.security.Permission, _a<.javax.management.MBeanServerPermissionCollection |
_b<.long, _a<.sun.java2d.xr.XcbRequestCounter |
_b<.java.lang.Object, _a<.sun.tools.jar.Main$1 |
_b<.int, _a<.sun.java2d.marlin.stats.StatLong |
_b<.java.lang.String, _a<.java.awt.List |
_b<.java.lang.String, _a<.javax.naming.CompositeName |
_b<.jdk.internal.org.objectweb.asm.tree.InsnList, _a<.jdk.internal.org.objectweb.asm.tree.InsnList |
_b<._E, _a<.sun.awt.util.IdentityArrayList |
_b<.java.util.Map$Entry<_K, _V>, _a<.java.util.Hashtable$EntrySet |
_b<._E, _a<.javax.security.auth.Subject$SecureSet |
_b<._E, _a<.java.util.JumboEnumSet |
_b<._E, _a<.java.util.PriorityQueue |
_b<.com.sun.org.apache.xml.internal.security.keys.content.DEREncodedKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.javax.swing.AbstractButton, _a<.javax.swing.ButtonGroup |
_b<.int, _a<.java.util.stream.IntStream$Builder |
_b<.java.lang.String, _a<.javax.swing.JMenu |
_b<.com.sun.org.apache.xml.internal.security.keys.content.MgmtData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.javax.xml.stream.XMLEventReader, _a<.com.sun.xml.internal.stream.writers.XMLEventWriterImpl |
_b<.java.lang.Object, _a<.javax.management.AttributeList |
_b<._E, _a<.java.util.RegularEnumSet |
_b<._E, _a<.java.util.Collections$CheckedCollection |
_b<._T, _a<.javax.security.auth.Subject$ClassSet |
_b<.java.security.Permission, _a<.java.security.PermissionCollection |
_b<.jdk.internal.org.objectweb.asm.tree.AbstractInsnNode, _a<.jdk.internal.org.objectweb.asm.tree.InsnList |
_b<.java.lang.Object, _a<.com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl$XSObjectListIterator |
_b<.java.security.Permission, _a<.java.security.PermissionsHash |
_b<.java.lang.Object, _a<.java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue |
_b<.double, _a<.java.util.stream.DoubleStream$Builder |
_b<.com.sun.org.apache.xml.internal.security.keys.content.keyvalues.RSAKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.long, _a<.sun.java2d.marlin.stats.StatLong |
_b<.javax.xml.datatype.Duration, _a<.com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl |
_b<.java.security.Permission, _a<.java.security.AllPermissionCollection |
_b<.sun.awt.X11.XAtom, _a<.sun.awt.X11.XAtomList |
_b<.javax.swing.Action, _a<.javax.swing.JPopupMenu |
_b<.java.lang.Object, _a<.java.util.Hashtable$EntrySet |
_b<.java.security.Permission, _a<.java.security.UnresolvedPermissionCollection |
_b<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509Digest, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_b<.javax.management.relation.RoleUnresolved, _a<.javax.management.relation.RoleUnresolvedList |
_b<.java.lang.Object, _a<.javax.print.attribute.standard.JobStateReasons |
_b<._E, _a<.java.util.Collections$UnmodifiableList$1 |
_b<._E, _a<.java.util.Deque |
_b<._E, _a<.java.util.Collection |
_b<._E, _a<.javax.imageio.spi.PartiallyOrderedSet |
_b<.sun.security.x509.GeneralSubtree, _a<.sun.security.x509.GeneralSubtrees |
_b<.long, _a<.java.util.concurrent.atomic.LongAdder |
_b<.java.awt.Menu, _a<.java.awt.MenuBar |
_b<.com.sun.org.apache.xml.internal.security.keys.content.X509Data, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.java.awt.Point, _a<.java.awt.Rectangle |
_b<.java.security.Permission, _a<.javax.security.auth.kerberos.KrbDelegationPermissionCollection |
_b<.javax.xml.stream.events.XMLEvent, _a<.javax.xml.stream.XMLEventWriter |
_b<.com.sun.org.apache.xml.internal.security.keys.content.KeyInfoReference, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintJobAttributeSet |
_b<.com.sun.org.apache.xml.internal.security.keys.content.SPKIData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.java.security.Permission, _a<.java.security.BasicPermissionCollection |
_b<._E, _a<.java.util.concurrent.BlockingDeque |
_b<.sun.net.httpserver.HttpContextImpl, _a<.sun.net.httpserver.ContextList |
_b<._E, _a<.java.util.concurrent.ConcurrentLinkedDeque |
_b<._E, _a<.java.util.Collections$SetFromMap |
_b<.javax.swing.JMenuItem, _a<.javax.swing.JPopupMenu |
_b<.java.awt.MenuItem, _a<.java.awt.Menu |
_b<.java.lang.Object, _a<.java.beans.beancontext.BeanContextSupport |
_b<.java.lang.String, _a<.com.sun.org.apache.xerces.internal.dom.DOMStringListImpl |
_b<.short, _a<.com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$ShortVector |
_b<.javax.xml.stream.XMLEventReader, _a<.javax.xml.stream.XMLEventWriter |
_b<.java.lang.String, _a<.com.sun.jndi.dns.DnsName |
_b<._E, _a<.java.util.ListIterator |
_b<._E, _a<.java.util.LinkedList |
_b<.long, _a<.sun.java2d.marlin.stats.Histogram |
_b<._E, _a<.java.util.concurrent.DelayQueue |
_b<.java.security.Permission, _a<.java.net.SocketPermissionCollection |
_b<.java.security.Permission, _a<.java.security.Policy$UnsupportedEmptyCollection |
_b<._E, _a<.java.util.concurrent.CopyOnWriteArrayList |
_b<.java.lang.String, _a<.javax.naming.CompoundName |
_b<._E, _a<.java.util.List |
_b<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWIterator |
_b<.javax.swing.JMenuItem, _a<.javax.swing.JMenu |
_b<.java.security.Permission, _a<.java.security.Permissions |
_b<.java.security.KeyStore, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_b<.long, _a<.java.util.stream.LongStream$Builder |
_b<._E, _a<.java.util.AbstractCollection |
_b<.[Lcom.sun.media.sound.ModelPerformer;, _a<.com.sun.media.sound.SimpleInstrument |
_b<.java.security.cert.X509Certificate, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_b<._E, _a<.java.util.concurrent.PriorityBlockingQueue |
_b<.com.sun.org.apache.xerces.internal.xs.XSObject, _a<.com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl$XSObjectListIterator |
_b<.java.lang.CharSequence, _a<.java.util.StringJoiner |
_b<._E, _a<.java.util.concurrent.ArrayBlockingQueue |
_b<.javax.swing.JMenu, _a<.javax.swing.JMenuBar |
_b<.java.lang.Object, _a<.java.util.RegularEnumSet |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSetUtilities$SynchronizedAttributeSet |
_b<.java.lang.String, _a<.javax.swing.JPopupMenu |
_b<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509Certificate, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_b<._E, _a<.java.util.ArrayList$ListItr |
_b<.com.sun.org.apache.xml.internal.security.keys.content.KeyName, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.javax.accessibility.AccessibleState, _a<.javax.accessibility.AccessibleStateSet |
_b<.javax.naming.RefAddr, _a<.javax.naming.Reference |
_b<.java.lang.String, _a<.javax.naming.NameImpl |
_b<.javax.xml.stream.events.XMLEvent, _a<.javax.xml.stream.util.XMLEventConsumer |
_b<.sun.security.util.math.IntegerModuloP, _a<.sun.security.util.math.IntegerModuloP |
_b<._E, _a<.java.util.ArrayList |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintServiceAttributeSet |
_b<.java.lang.Object, _a<.javax.naming.directory.BasicAttribute |
_b<._E, _a<.java.util.concurrent.ConcurrentLinkedQueue |
_b<.int, _a<.java.io.ObjectInputStream$HandleTable$HandleList |
_b<.java.lang.String, _a<.java.awt.Choice |
_b<.java.lang.Object, _a<.javax.management.relation.RoleUnresolvedList |
_b<.com.sun.org.apache.bcel.internal.generic.InstructionHandle, _a<.com.sun.org.apache.xalan.internal.xsltc.compiler.FlowList |
_b<.java.io.File, _a<.sun.font.CreatedFontTracker |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.HashAttributeSet |
_b<._E, _a<.java.util.LinkedList$ListItr |
_b<.javax.naming.ldap.Rdn, _a<.javax.naming.ldap.LdapName |
_b<.jdk.internal.org.objectweb.asm.Type, _a<.jdk.internal.org.objectweb.asm.commons.InstructionAdapter |
_b<._E, _a<.java.util.Set |
_b<.java.security.Permission, _a<.javax.security.auth.kerberos.KrbServicePermissionCollection |
_b<.com.sun.org.apache.xml.internal.security.keys.content.RetrievalMethod, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.short, _a<.java.awt.image.renderable.ParameterBlock |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintRequestAttributeSet |
_b<.float, _a<.java.awt.image.renderable.ParameterBlock |
_b<._E, _a<.java.util.concurrent.LinkedBlockingDeque |
_b<.javax.swing.Action, _a<.javax.swing.JToolBar |
_b<.java.lang.String, _a<.javax.naming.ldap.LdapName |
_b<._E, _a<.java.util.Collections$SynchronizedCollection |
_b<._E, _a<.java.util.Queue |
_b<.javax.swing.Action, _a<.javax.swing.JMenu |
_b<.java.awt.Component, _a<.java.awt.Container |
_b<._E, _a<.java.util.TreeSet |
_b<.javax.xml.stream.events.XMLEvent, _a<.com.sun.xml.internal.stream.writers.XMLEventWriterImpl |
_b<.java.security.PublicKey, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.java.awt.PopupMenu, _a<.java.awt.Component |
_b<.com.sun.org.apache.xerces.internal.xs.XSNamespaceItem, _a<.com.sun.org.apache.xerces.internal.impl.xs.XSModelImpl$XSNamespaceItemListIterator |
_b<.int, _a<.java.awt.image.renderable.ParameterBlock |
_b<.sun.net.www.MimeEntry, _a<.sun.net.www.MimeTable |
_b<._E, _a<.java.util.concurrent.CopyOnWriteArraySet |
_b<.java.awt.Rectangle, _a<.java.awt.Rectangle |
_b<.java.lang.String, _a<.com.sun.jndi.ldap.LdapName |
_b<._E, _a<.java.util.Collections$UnmodifiableCollection |
_b<.javax.swing.GroupLayout$ComponentInfo, _a<.javax.swing.GroupLayout$LinkInfo |
_b<._E, _a<.java.util.Vector$ListItr |
_b<.long, _a<.java.awt.image.renderable.ParameterBlock |
_b<._E, _a<.java.util.concurrent.BlockingQueue |
_b<._T, _a<.java.util.stream.Streams$StreamBuilderImpl |
_b<.byte, _a<.java.awt.image.renderable.ParameterBlock |
_b<.sun.awt.DisplayChangedListener, _a<.sun.awt.SunDisplayChanger |
_b<.com.sun.media.sound.ModelPerformer, _a<.com.sun.media.sound.SimpleInstrument |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.DocAttributeSet |
_b<._V, _a<.java.util.concurrent.ConcurrentHashMap$ValuesView |
_b<.com.sun.media.sound.ModelInstrument, _a<.com.sun.media.sound.SimpleInstrument |
_b<.java.lang.Object, _a<.java.util.concurrent.DelayQueue |
_b<.sun.security.x509.GeneralName, _a<.sun.security.x509.GeneralNames |
_b<.sun.security.provider.PolicyParser$PermissionEntry, _a<.sun.security.provider.PolicyParser$GrantEntry |
_b<._E, _a<.java.util.ArrayList$SubList$1 |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSet |
_b<.java.lang.Object, _a<.javax.naming.directory.Attribute |
_b<.java.lang.Object, _a<.jdk.internal.org.objectweb.asm.tree.MethodNode$1 |
_b<.java.security.Permission, _a<.java.io.FilePermissionCollection |
_b<.java.util.zip.ZipEntry, _a<.sun.tools.jar.Main$1 |
_b<.java.lang.String, _a<.java.awt.Menu |
_b<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWSubList |
_b<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SKI, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_b<.javax.xml.datatype.Duration, _a<.javax.xml.datatype.XMLGregorianCalendar |
_b<.java.lang.Object, _a<.java.util.concurrent.ConcurrentHashMap$EntrySetView |
_b<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509IssuerSerial, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_b<.javax.swing.tree.MutableTreeNode, _a<.javax.swing.tree.DefaultMutableTreeNode |
_b<.sun.awt.image.ImageFetchable, _a<.sun.awt.image.ImageFetcher |
_b<.javax.management.Attribute, _a<.javax.management.AttributeList |
_b<.double, _a<.java.awt.image.renderable.ParameterBlock |
_b<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWSubListIterator |
_b<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509CRL, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_b<.java.lang.Object, _a<.jdk.internal.org.objectweb.asm.tree.InsnList$InsnListIterator |
_b<.java.lang.Object, _a<.java.util.Collections$CheckedMap$CheckedEntrySet |
_b<.java.lang.Object, _a<.java.awt.image.renderable.ParameterBlock |
_b<.javax.print.attribute.standard.JobStateReason, _a<.javax.print.attribute.standard.JobStateReasons |
_b<._E, _a<.java.util.ArrayDeque }
{ _c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.HashAttributeSet |
_c<.javax.swing.GroupLayout$ComponentInfo, _a<.javax.swing.GroupLayout$LinkInfo |
_c<._E, _a<.java.util.ArrayList$SubList$1 |
_c<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SKI, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_c<.java.lang.Object, _a<.java.util.concurrent.ConcurrentHashMap$EntrySetView |
_c<._E, _a<.java.util.Set |
_c<._E, _a<.java.util.ArrayList$ListItr |
_c<.java.awt.geom.Point2D, _a<.java.awt.geom.Rectangle2D |
_c<.javax.xml.datatype.Duration, _a<.com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl |
_c<.int, _a<.java.awt.image.renderable.ParameterBlock |
_c<.java.security.Permission, _a<.java.util.PropertyPermissionCollection |
_c<.javax.swing.Action, _a<.javax.swing.JMenu |
_c<.com.sun.org.apache.xml.internal.security.keys.content.SPKIData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<._E, _a<.java.util.concurrent.ConcurrentSkipListSet |
_c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSetUtilities$UnmodifiableAttributeSet |
_c<.java.util.zip.ZipEntry, _a<.sun.tools.jar.Main$1 |
_c<.java.security.Permission, _a<.javax.management.MBeanServerPermissionCollection |
_c<.java.security.Permission, _a<.java.security.UnresolvedPermissionCollection |
_c<._V, _a<.java.util.concurrent.ConcurrentHashMap$ValuesView |
_c<.int, _a<.sun.java2d.marlin.stats.StatLong |
_c<._E, _a<.java.util.Collections$CheckedList$1 |
_c<.java.lang.String, _a<.javax.naming.Name |
_c<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolverSpi, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSet |
_c<.javax.management.relation.RoleUnresolved, _a<.javax.management.relation.RoleUnresolvedList |
_c<.java.awt.Component, _a<.javax.swing.JMenu |
_c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintJobAttributeSet |
_c<._E, _a<.java.util.ArrayList |
_c<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SubjectName, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_c<.java.lang.Object, _a<.javax.print.attribute.standard.JobStateReasons |
_c<.char, _a<.java.awt.image.renderable.ParameterBlock |
_c<.java.awt.Point, _a<.java.awt.Rectangle |
_c<.javax.management.relation.Role, _a<.javax.management.relation.RoleList |
_c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintServiceAttributeSet |
_c<._E, _a<.java.util.Vector$ListItr |
_c<.javax.xml.datatype.Duration, _a<.javax.xml.datatype.XMLGregorianCalendar |
_c<.javax.swing.Action, _a<.javax.swing.JPopupMenu |
_c<.long, _a<.java.util.concurrent.atomic.LongAdder |
_c<.sun.security.util.math.IntegerModuloP, _a<.sun.security.util.math.intpoly.IntegerPolynomial$Element |
_c<.java.awt.TrayIcon, _a<.java.awt.SystemTray |
_c<.java.lang.Object, _a<.javax.management.AttributeList |
_c<.java.lang.String, _a<.javax.naming.CompositeName |
_c<.short, _a<.com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$ShortVector |
_c<.com.sun.org.apache.xerces.internal.xs.XSObject, _a<.com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl$XSObjectListIterator |
_c<._T, _a<.javax.security.auth.Subject$ClassSet |
_c<.sun.security.provider.PolicyParser$GrantEntry, _a<.sun.security.provider.PolicyParser |
_c<._K, _a<.java.util.concurrent.ConcurrentHashMap$KeySetView |
_c<.[Lcom.sun.media.sound.ModelPerformer;, _a<.com.sun.media.sound.SimpleInstrument |
_c<.java.awt.Component, _a<.java.awt.Container |
_c<.java.lang.Object, _a<.javax.naming.directory.BasicAttribute |
_c<._E, _a<.java.util.LinkedList |
_c<._E, _a<.sun.awt.util.IdentityArrayList |
_c<.javax.naming.ldap.Rdn, _a<.javax.naming.ldap.LdapName |
_c<.double, _a<.java.awt.image.renderable.ParameterBlock |
_c<._E, _a<.java.util.Collections$AsLIFOQueue |
_c<.com.sun.org.apache.xml.internal.security.keys.content.MgmtData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<._E, _a<.java.util.Collections$SetFromMap |
_c<.java.lang.String, _a<.com.sun.jndi.dns.DnsName |
_c<.java.lang.Object, _a<.javax.management.relation.RoleUnresolvedList |
_c<.sun.security.x509.GeneralName, _a<.sun.security.x509.GeneralNames |
_c<.sun.awt.X11.XAtom, _a<.sun.awt.X11.XAtomList |
_c<.javax.xml.stream.XMLEventReader, _a<.com.sun.xml.internal.stream.writers.XMLEventWriterImpl |
_c<.java.lang.Object, _a<.com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl$XSObjectListIterator |
_c<.java.lang.Object, _a<.java.util.JumboEnumSet |
_c<.java.util.Map$Entry<_K, _V>, _a<.java.util.concurrent.ConcurrentHashMap$EntrySetView |
_c<._E, _a<.java.util.AbstractList$ListItr |
_c<.javax.xml.datatype.Duration, _a<.javax.xml.datatype.Duration |
_c<.javax.swing.JMenuItem, _a<.javax.swing.JPopupMenu |
_c<.java.lang.Object, _a<.com.sun.org.apache.xerces.internal.impl.xs.XSModelImpl$XSNamespaceItemListIterator |
_c<.java.lang.String, _a<.com.sun.jndi.ldap.LdapName |
_c<.java.security.KeyStore, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_c<.java.math.BigDecimal, _a<.java.math.BigDecimal |
_c<.short, _a<.java.awt.image.renderable.ParameterBlock |
_c<.float, _a<.java.awt.image.renderable.ParameterBlock |
_c<.java.security.Permission, _a<.java.security.PermissionCollection |
_c<._E, _a<.javax.security.auth.Subject$SecureSet |
_c<.java.awt.PopupMenu, _a<.java.awt.Component |
_c<.java.awt.Rectangle, _a<.java.awt.Rectangle |
_c<.com.sun.media.sound.ModelPerformer, _a<.com.sun.media.sound.SimpleInstrument |
_c<.javax.swing.Action, _a<.javax.swing.JToolBar |
_c<._E, _a<.java.util.concurrent.ConcurrentLinkedDeque |
_c<._E, _a<.java.util.Collections$UnmodifiableCollection |
_c<._E, _a<.java.util.Queue |
_c<.java.lang.String, _a<.javax.naming.ldap.LdapName |
_c<.java.lang.Runnable, _a<.java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue |
_c<.jdk.internal.org.objectweb.asm.tree.InsnList, _a<.jdk.internal.org.objectweb.asm.tree.InsnList |
_c<.sun.net.www.MimeEntry, _a<.sun.net.www.MimeTable |
_c<.com.sun.org.apache.xml.internal.security.keys.content.keyvalues.DSAKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<.java.awt.Menu, _a<.java.awt.MenuBar |
_c<._E, _a<.java.util.ArrayDeque |
_c<._E, _a<.java.util.List |
_c<._E, _a<.java.util.JumboEnumSet |
_c<.java.io.File, _a<.sun.font.CreatedFontTracker |
_c<.sun.net.httpserver.HttpContextImpl, _a<.sun.net.httpserver.ContextList |
_c<._E, _a<.java.util.AbstractQueue |
_c<.double, _a<.java.util.concurrent.atomic.DoubleAdder |
_c<.javax.print.attribute.standard.JobStateReason, _a<.javax.print.attribute.standard.JobStateReasons |
_c<.java.awt.RenderingHints, _a<.java.awt.RenderingHints |
_c<.long, _a<.java.awt.image.renderable.ParameterBlock |
_c<._E, _a<.java.util.concurrent.PriorityBlockingQueue |
_c<.java.util.Map$Entry<_K, _V>, _a<.java.util.Collections$CheckedMap$CheckedEntrySet |
_c<._E, _a<.java.util.AbstractList |
_c<.java.security.Permission, _a<.javax.security.auth.kerberos.KrbServicePermissionCollection |
_c<.java.awt.geom.Rectangle2D, _a<.java.awt.geom.Rectangle2D |
_c<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509IssuerSerial, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_c<.java.lang.Object, _a<.javax.management.relation.RoleList |
_c<.double, _a<.java.util.stream.DoubleStream$Builder |
_c<._E, _a<.java.util.AbstractCollection |
_c<.byte, _a<.java.awt.image.renderable.ParameterBlock |
_c<.java.security.Permission, _a<.java.net.SocketPermissionCollection |
_c<.javax.naming.RefAddr, _a<.javax.naming.Reference |
_c<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509Certificate, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_c<.java.lang.Object, _a<.java.util.Collections$CheckedMap$CheckedEntrySet |
_c<._E, _a<.java.util.TreeSet |
_c<.java.security.Permission, _a<.java.io.FilePermissionCollection |
_c<.java.security.Permission, _a<.java.security.Policy$UnsupportedEmptyCollection |
_c<._E, _a<.java.util.Collections$SynchronizedCollection |
_c<._E, _a<.java.util.Collections$UnmodifiableList$1 |
_c<.com.sun.org.apache.xml.internal.security.keys.content.X509Data, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<._E, _a<.sun.nio.ch.Util$2 |
_c<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWSubListIterator |
_c<.java.security.Permission, _a<.java.security.Permissions |
_c<._E, _a<.java.util.Collections$CheckedCollection |
_c<.sun.security.util.math.IntegerModuloP, _a<.sun.security.util.math.IntegerModuloP |
_c<._E, _a<.java.util.Deque |
_c<._E, _a<.java.util.LinkedList$ListItr |
_c<.java.lang.String, _a<.java.awt.Choice |
_c<._E, _a<.java.util.concurrent.ConcurrentLinkedQueue |
_c<._E, _a<.java.util.Vector |
_c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.DocAttributeSet |
_c<.java.lang.Object, _a<.java.beans.beancontext.BeanContextSupport |
_c<.java.util.Map$Entry<_K, _V>, _a<.java.util.Hashtable$EntrySet |
_c<._E, _a<.javax.imageio.spi.PartiallyOrderedSet |
_c<.java.lang.String, _a<.javax.naming.NameImpl |
_c<._E, _a<.java.util.concurrent.LinkedBlockingDeque |
_c<.java.lang.String, _a<.java.awt.List |
_c<._E, _a<.java.util.concurrent.DelayQueue |
_c<.java.lang.Object, _a<.jdk.internal.org.objectweb.asm.tree.InsnList$InsnListIterator |
_c<.javax.swing.AbstractButton, _a<.javax.swing.ButtonGroup |
_c<.java.security.PublicKey, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509Digest, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_c<.java.awt.Component, _a<.javax.swing.JTabbedPane |
_c<.java.lang.Object, _a<.java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue |
_c<.long, _a<.sun.java2d.marlin.stats.Histogram |
_c<._E, _a<.java.util.concurrent.BlockingQueue |
_c<.jdk.internal.org.objectweb.asm.tree.AbstractInsnNode, _a<.jdk.internal.org.objectweb.asm.tree.InsnList |
_c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSetUtilities$SynchronizedAttributeSet |
_c<.java.lang.Object, _a<.java.util.concurrent.DelayQueue |
_c<.java.security.Permission, _a<.java.security.PermissionsHash |
_c<.javax.swing.JMenu, _a<.javax.swing.JMenuBar |
_c<.long, _a<.java.util.stream.LongStream$Builder |
_c<.javax.accessibility.AccessibleState, _a<.javax.accessibility.AccessibleStateSet |
_c<.javax.xml.stream.XMLEventReader, _a<.javax.xml.stream.XMLEventWriter |
_c<.long, _a<.sun.java2d.xr.XcbRequestCounter |
_c<.java.security.Permission, _a<.javax.security.auth.kerberos.KrbDelegationPermissionCollection |
_c<.com.sun.org.apache.bcel.internal.classfile.JavaClass, _a<.com.sun.org.apache.bcel.internal.util.ClassSet |
_c<.java.awt.geom.Area, _a<.java.awt.geom.Area |
_c<.com.sun.org.apache.xml.internal.security.keys.content.KeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWIterator |
_c<.sun.awt.DisplayChangedListener, _a<.sun.awt.SunDisplayChanger |
_c<._T, _a<.java.util.stream.Streams$StreamBuilderImpl |
_c<.java.lang.String, _a<.javax.naming.CompoundName |
_c<._E, _a<.java.util.Collections$EmptyListIterator |
_c<.sun.security.provider.PolicyParser$PermissionEntry, _a<.sun.security.provider.PolicyParser$GrantEntry |
_c<.java.lang.Object, _a<.javax.naming.directory.Attribute |
_c<._E, _a<.java.util.ListIterator |
_c<.java.security.Permission, _a<.java.security.AllPermissionCollection |
_c<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWSubList |
_c<.java.lang.String, _a<.javax.swing.JPopupMenu |
_c<.sun.security.x509.GeneralSubtree, _a<.sun.security.x509.GeneralSubtrees |
_c<.java.lang.Object, _a<.java.util.Hashtable$EntrySet |
_c<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509CRL, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_c<.javax.xml.stream.events.XMLEvent, _a<.com.sun.xml.internal.stream.writers.XMLEventWriterImpl |
_c<.javax.xml.datatype.Duration, _a<.com.sun.org.apache.xerces.internal.jaxp.datatype.DurationImpl |
_c<.javax.swing.tree.MutableTreeNode, _a<.javax.swing.tree.DefaultMutableTreeNode |
_c<.com.sun.org.apache.xml.internal.security.keys.content.DEREncodedKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<._E, _a<.java.util.concurrent.BlockingDeque |
_c<.long, _a<.sun.java2d.marlin.stats.StatLong |
_c<.java.math.BigInteger, _a<.java.math.BigInteger |
_c<._E, _a<.java.util.concurrent.CopyOnWriteArrayList |
_c<.java.security.cert.X509Certificate, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_c<._E, _a<.java.util.concurrent.CopyOnWriteArraySet |
_c<.javax.management.Attribute, _a<.javax.management.AttributeList |
_c<.java.lang.Object, _a<.java.util.RegularEnumSet |
_c<.java.lang.String, _a<.javax.swing.JMenu |
_c<.java.lang.Object, _a<.com.sun.jndi.ldap.LdapAttribute |
_c<.javax.xml.stream.events.XMLEvent, _a<.javax.xml.stream.util.XMLEventConsumer |
_c<.java.lang.String, _a<.com.sun.org.apache.xerces.internal.dom.DOMStringListImpl |
_c<.java.security.Permission, _a<.java.security.BasicPermissionCollection |
_c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintRequestAttributeSet |
_c<._E, _a<.java.util.concurrent.LinkedTransferQueue |
_c<.java.lang.Object, _a<.sun.tools.jar.Main$1 |
_c<._E, _a<.java.util.RegularEnumSet |
_c<.sun.awt.image.ImageFetchable, _a<.sun.awt.image.ImageFetcher |
_c<.java.lang.Object, _a<.java.awt.image.renderable.ParameterBlock |
_c<.com.sun.org.apache.xml.internal.security.keys.content.PGPData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<.javax.xml.stream.events.XMLEvent, _a<.javax.xml.stream.XMLEventWriter |
_c<.java.awt.MenuItem, _a<.java.awt.Menu |
_c<.com.sun.org.apache.xerces.internal.xs.XSNamespaceItem, _a<.com.sun.org.apache.xerces.internal.impl.xs.XSModelImpl$XSNamespaceItemListIterator |
_c<.javax.accessibility.AccessibleRelation, _a<.javax.accessibility.AccessibleRelationSet |
_c<.com.sun.org.apache.xml.internal.security.keys.content.keyvalues.RSAKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<.int, _a<.java.util.stream.IntStream$Builder |
_c<.java.lang.Object, _a<.jdk.internal.org.objectweb.asm.tree.MethodNode$1 |
_c<.int, _a<.com.sun.org.apache.xalan.internal.xsltc.util.IntegerArray |
_c<.com.sun.media.sound.ModelInstrument, _a<.com.sun.media.sound.SimpleInstrument |
_c<.com.sun.org.apache.xml.internal.security.keys.content.RetrievalMethod, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<._T, _a<.java.util.stream.Stream$Builder |
_c<.jdk.internal.org.objectweb.asm.Type, _a<.jdk.internal.org.objectweb.asm.commons.InstructionAdapter |
_c<._E, _a<.java.util.PriorityQueue |
_c<.java.lang.String, _a<.java.awt.Menu |
_c<.int, _a<.sun.java2d.marlin.stats.Histogram |
_c<.int, _a<.java.io.ObjectInputStream$HandleTable$HandleList |
_c<.javax.swing.JMenuItem, _a<.javax.swing.JMenu |
_c<._E, _a<.java.util.HashSet |
_c<._E, _a<.java.util.concurrent.ArrayBlockingQueue |
_c<.javax.sound.midi.MidiEvent, _a<.javax.sound.midi.Track |
_c<.java.lang.CharSequence, _a<.java.util.StringJoiner |
_c<.com.sun.org.apache.xml.internal.security.keys.content.KeyInfoReference, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<.com.sun.org.apache.xml.internal.security.keys.content.KeyName, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<.com.sun.org.apache.bcel.internal.generic.InstructionHandle, _a<.com.sun.org.apache.xalan.internal.xsltc.compiler.FlowList |
_c<.java.awt.Component, _a<.sun.awt.X11.InfoWindow |
_c<._E, _a<.java.util.Collection |
_c<._T_array, _a<.sun.swing.AccumulativeRunnable |
_c<._T, _a<.com.sun.jmx.remote.internal.ArrayQueue }
{ _d<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SubjectName, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_d<._E, _a<.java.util.Collections$SetFromMap |
_d<.javax.swing.JMenuItem, _a<.javax.swing.JPopupMenu |
_d<.int, _a<.java.util.stream.IntStream$Builder |
_d<.java.awt.RenderingHints, _a<.java.awt.RenderingHints |
_d<.long, _a<.java.awt.image.renderable.ParameterBlock |
_d<.javax.accessibility.AccessibleState, _a<.javax.accessibility.AccessibleStateSet |
_d<._E, _a<.java.util.Collections$CheckedList$1 |
_d<.java.lang.Runnable, _a<.java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue |
_d<.java.lang.Object, _a<.java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue |
_d<.java.awt.geom.Point2D, _a<.java.awt.geom.Rectangle2D |
_d<.java.lang.String, _a<.javax.swing.JMenu |
_d<.java.lang.String, _a<.javax.naming.CompositeName |
_d<._E, _a<.java.util.AbstractQueue |
_d<.java.lang.String, _a<.com.sun.org.apache.xerces.internal.dom.DOMStringListImpl |
_d<.java.lang.String, _a<.java.awt.List |
_d<._E, _a<.java.util.Collection |
_d<.int, _a<.com.sun.org.apache.xalan.internal.xsltc.util.IntegerArray |
_d<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWIterator |
_d<.java.lang.Object, _a<.java.util.RegularEnumSet |
_d<.com.sun.org.apache.xerces.internal.xs.XSNamespaceItem, _a<.com.sun.org.apache.xerces.internal.impl.xs.XSModelImpl$XSNamespaceItemListIterator |
_d<.char, _a<.java.awt.image.renderable.ParameterBlock |
_d<.java.lang.String, _a<.javax.naming.CompoundName |
_d<.java.security.Permission, _a<.java.util.PropertyPermissionCollection |
_d<.[Lcom.sun.media.sound.ModelPerformer;, _a<.com.sun.media.sound.SimpleInstrument |
_d<.java.awt.Component, _a<.java.awt.Container |
_d<.sun.awt.image.ImageFetchable, _a<.sun.awt.image.ImageFetcher |
_d<._E, _a<.java.util.LinkedList |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSetUtilities$UnmodifiableAttributeSet |
_d<.java.lang.CharSequence, _a<.java.util.StringJoiner |
_d<.java.security.Permission, _a<.java.security.UnresolvedPermissionCollection |
_d<.java.lang.Object, _a<.com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl$XSObjectListIterator |
_d<.jdk.internal.org.objectweb.asm.Type, _a<.jdk.internal.org.objectweb.asm.commons.InstructionAdapter |
_d<.java.util.zip.ZipEntry, _a<.sun.tools.jar.Main$1 |
_d<._E, _a<.java.util.Collections$UnmodifiableCollection |
_d<.javax.management.relation.Role, _a<.javax.management.relation.RoleList |
_d<.javax.management.Attribute, _a<.javax.management.AttributeList |
_d<._T, _a<.java.util.stream.Stream$Builder |
_d<.java.security.Permission, _a<.javax.security.auth.kerberos.KrbServicePermissionCollection |
_d<.com.sun.org.apache.bcel.internal.generic.InstructionHandle, _a<.com.sun.org.apache.xalan.internal.xsltc.compiler.FlowList |
_d<.javax.naming.ldap.Rdn, _a<.javax.naming.ldap.LdapName |
_d<.long, _a<.java.util.concurrent.atomic.LongAdder |
_d<.java.lang.Object, _a<.javax.management.relation.RoleList |
_d<._E, _a<.java.util.concurrent.LinkedTransferQueue |
_d<.java.security.Permission, _a<.java.security.PermissionsHash |
_d<.java.lang.Object, _a<.jdk.internal.org.objectweb.asm.tree.InsnList$InsnListIterator |
_d<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509Certificate, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_d<.java.lang.String, _a<.com.sun.jndi.dns.DnsName |
_d<.javax.xml.stream.events.XMLEvent, _a<.com.sun.xml.internal.stream.writers.XMLEventWriterImpl |
_d<.java.awt.Component, _a<.javax.swing.JMenu |
_d<._E, _a<.java.util.TreeSet |
_d<.java.awt.Menu, _a<.java.awt.MenuBar |
_d<.int, _a<.java.io.ObjectInputStream$HandleTable$HandleList |
_d<.java.util.Map$Entry<_K, _V>, _a<.java.util.Collections$CheckedMap$CheckedEntrySet |
_d<.sun.security.x509.GeneralName, _a<.sun.security.x509.GeneralNames |
_d<.javax.swing.Action, _a<.javax.swing.JMenu |
_d<.com.sun.org.apache.bcel.internal.classfile.JavaClass, _a<.com.sun.org.apache.bcel.internal.util.ClassSet |
_d<.short, _a<.com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$ShortVector |
_d<._E, _a<.java.util.Collections$CheckedCollection |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSetUtilities$SynchronizedAttributeSet |
_d<.java.util.Map$Entry<_K, _V>, _a<.java.util.Hashtable$EntrySet |
_d<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509Digest, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_d<._E, _a<.java.util.concurrent.LinkedBlockingDeque |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.HashAttributeSet |
_d<.java.security.PublicKey, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<._E, _a<.java.util.Deque |
_d<._E, _a<.java.util.PriorityQueue |
_d<.double, _a<.java.util.stream.DoubleStream$Builder |
_d<.sun.awt.DisplayChangedListener, _a<.sun.awt.SunDisplayChanger |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSet |
_d<.sun.security.provider.PolicyParser$PermissionEntry, _a<.sun.security.provider.PolicyParser$GrantEntry |
_d<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509CRL, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_d<._E, _a<.java.util.AbstractCollection |
_d<.javax.xml.stream.events.XMLEvent, _a<.javax.xml.stream.util.XMLEventConsumer |
_d<._E, _a<.java.util.concurrent.BlockingDeque |
_d<.javax.xml.datatype.Duration, _a<.javax.xml.datatype.XMLGregorianCalendar |
_d<._E, _a<.java.util.concurrent.ConcurrentLinkedQueue |
_d<.java.security.Permission, _a<.java.security.Permissions |
_d<.java.lang.Object, _a<.java.util.concurrent.ConcurrentHashMap$EntrySetView |
_d<._E, _a<.java.util.AbstractList |
_d<.int, _a<.sun.java2d.marlin.stats.Histogram |
_d<.java.io.File, _a<.sun.font.CreatedFontTracker |
_d<.java.lang.Object, _a<.java.util.JumboEnumSet |
_d<._T, _a<.java.util.stream.Streams$StreamBuilderImpl |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintServiceAttributeSet |
_d<._E, _a<.java.util.ArrayList |
_d<.javax.accessibility.AccessibleRelation, _a<.javax.accessibility.AccessibleRelationSet |
_d<.double, _a<.java.awt.image.renderable.ParameterBlock |
_d<._E, _a<.java.util.Vector$ListItr |
_d<.java.util.Map$Entry<_K, _V>, _a<.java.util.concurrent.ConcurrentHashMap$EntrySetView |
_d<.java.awt.Component, _a<.javax.swing.JTabbedPane |
_d<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SKI, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_d<.javax.swing.GroupLayout$ComponentInfo, _a<.javax.swing.GroupLayout$LinkInfo |
_d<._E, _a<.sun.nio.ch.Util$2 |
_d<._E, _a<.java.util.Vector |
_d<.java.lang.Object, _a<.javax.naming.directory.Attribute |
_d<.com.sun.org.apache.xerces.internal.xs.XSObject, _a<.com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl$XSObjectListIterator |
_d<.sun.net.httpserver.HttpContextImpl, _a<.sun.net.httpserver.ContextList |
_d<.java.lang.Object, _a<.sun.tools.jar.Main$1 |
_d<.com.sun.org.apache.xml.internal.security.keys.content.keyvalues.RSAKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<._E, _a<.java.util.concurrent.CopyOnWriteArraySet |
_d<.com.sun.org.apache.xml.internal.security.keys.content.KeyInfoReference, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<._E, _a<.java.util.JumboEnumSet |
_d<._V, _a<.java.util.concurrent.ConcurrentHashMap$ValuesView |
_d<.javax.xml.stream.XMLEventReader, _a<.javax.xml.stream.XMLEventWriter |
_d<._E, _a<.java.util.AbstractList$ListItr |
_d<.javax.swing.Action, _a<.javax.swing.JToolBar |
_d<.java.lang.String, _a<.javax.naming.ldap.LdapName |
_d<.java.security.Permission, _a<.java.security.BasicPermissionCollection |
_d<.java.lang.Object, _a<.java.util.concurrent.DelayQueue |
_d<.jdk.internal.org.objectweb.asm.tree.InsnList, _a<.jdk.internal.org.objectweb.asm.tree.InsnList |
_d<._E, _a<.java.util.ArrayDeque |
_d<.javax.swing.AbstractButton, _a<.javax.swing.ButtonGroup |
_d<.java.math.BigInteger, _a<.java.math.BigInteger |
_d<.java.lang.String, _a<.javax.naming.NameImpl |
_d<.java.lang.Object, _a<.java.util.Collections$CheckedMap$CheckedEntrySet |
_d<._E, _a<.java.util.HashSet |
_d<.sun.security.provider.PolicyParser$GrantEntry, _a<.sun.security.provider.PolicyParser |
_d<._E, _a<.java.util.Set |
_d<._T, _a<.javax.security.auth.Subject$ClassSet |
_d<._E, _a<.java.util.Collections$SynchronizedCollection |
_d<.javax.xml.datatype.Duration, _a<.com.sun.org.apache.xerces.internal.jaxp.datatype.DurationImpl |
_d<.javax.xml.datatype.Duration, _a<.javax.xml.datatype.Duration |
_d<.java.lang.Object, _a<.jdk.internal.org.objectweb.asm.tree.MethodNode$1 |
_d<.java.lang.Object, _a<.java.beans.beancontext.BeanContextSupport |
_d<.java.math.BigDecimal, _a<.java.math.BigDecimal |
_d<.byte, _a<.java.awt.image.renderable.ParameterBlock |
_d<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWSubListIterator |
_d<._E, _a<.java.util.Collections$EmptyListIterator |
_d<.java.lang.Object, _a<.java.util.Hashtable$EntrySet |
_d<.java.security.Permission, _a<.java.io.FilePermissionCollection |
_d<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWSubList |
_d<.java.lang.Object, _a<.com.sun.org.apache.xerces.internal.impl.xs.XSModelImpl$XSNamespaceItemListIterator |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.DocAttributeSet |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintJobAttributeSet |
_d<._E, _a<.java.util.ListIterator |
_d<._E, _a<.java.util.RegularEnumSet |
_d<.java.awt.geom.Area, _a<.java.awt.geom.Area |
_d<.javax.xml.stream.events.XMLEvent, _a<.javax.xml.stream.XMLEventWriter |
_d<._E, _a<.java.util.ArrayList$ListItr |
_d<.javax.sound.midi.MidiEvent, _a<.javax.sound.midi.Track |
_d<.double, _a<.java.util.concurrent.atomic.DoubleAdder |
_d<.java.awt.Rectangle, _a<.java.awt.Rectangle |
_d<.com.sun.org.apache.xml.internal.security.keys.content.MgmtData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.com.sun.org.apache.xml.internal.security.keys.content.RetrievalMethod, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.com.sun.org.apache.xml.internal.security.keys.content.KeyName, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.java.lang.String, _a<.java.awt.Choice |
_d<.javax.management.relation.RoleUnresolved, _a<.javax.management.relation.RoleUnresolvedList |
_d<.java.lang.String, _a<.com.sun.jndi.ldap.LdapName |
_d<.sun.net.www.MimeEntry, _a<.sun.net.www.MimeTable |
_d<._E, _a<.java.util.concurrent.BlockingQueue |
_d<.javax.swing.JMenu, _a<.javax.swing.JMenuBar |
_d<.sun.awt.X11.XAtom, _a<.sun.awt.X11.XAtomList |
_d<.java.security.Permission, _a<.java.security.Policy$UnsupportedEmptyCollection |
_d<._E, _a<.javax.imageio.spi.PartiallyOrderedSet |
_d<._T, _a<.com.sun.jmx.remote.internal.ArrayQueue |
_d<.long, _a<.sun.java2d.marlin.stats.StatLong |
_d<.com.sun.media.sound.ModelPerformer, _a<.com.sun.media.sound.SimpleInstrument |
_d<.java.awt.Component, _a<.sun.awt.X11.InfoWindow |
_d<.java.lang.Object, _a<.java.awt.image.renderable.ParameterBlock |
_d<._E, _a<.java.util.Collections$UnmodifiableList$1 |
_d<.long, _a<.sun.java2d.marlin.stats.Histogram |
_d<.javax.xml.datatype.Duration, _a<.com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl |
_d<.java.awt.MenuItem, _a<.java.awt.Menu |
_d<.java.security.Permission, _a<.javax.management.MBeanServerPermissionCollection |
_d<._E, _a<.java.util.List |
_d<.javax.swing.tree.MutableTreeNode, _a<.javax.swing.tree.DefaultMutableTreeNode |
_d<._E, _a<.javax.security.auth.Subject$SecureSet |
_d<._E, _a<.java.util.concurrent.ConcurrentLinkedDeque |
_d<.java.security.cert.X509Certificate, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_d<.sun.security.util.math.IntegerModuloP, _a<.sun.security.util.math.intpoly.IntegerPolynomial$Element |
_d<.java.lang.Object, _a<.javax.naming.directory.BasicAttribute |
_d<.java.security.KeyStore, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_d<.com.sun.media.sound.ModelInstrument, _a<.com.sun.media.sound.SimpleInstrument |
_d<.java.awt.geom.Rectangle2D, _a<.java.awt.geom.Rectangle2D |
_d<._E, _a<.java.util.concurrent.ConcurrentSkipListSet |
_d<.javax.naming.RefAddr, _a<.javax.naming.Reference |
_d<.java.awt.Point, _a<.java.awt.Rectangle |
_d<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolverSpi, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_d<.com.sun.org.apache.xml.internal.security.keys.content.PGPData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.int, _a<.java.awt.image.renderable.ParameterBlock |
_d<._E, _a<.java.util.concurrent.DelayQueue |
_d<._E, _a<.java.util.concurrent.PriorityBlockingQueue |
_d<.java.security.Permission, _a<.java.security.PermissionCollection |
_d<._T_array, _a<.sun.swing.AccumulativeRunnable |
_d<.java.lang.String, _a<.javax.swing.JPopupMenu |
_d<.java.awt.TrayIcon, _a<.java.awt.SystemTray |
_d<.javax.swing.JMenuItem, _a<.javax.swing.JMenu |
_d<.long, _a<.sun.java2d.xr.XcbRequestCounter |
_d<.java.lang.String, _a<.javax.naming.Name |
_d<._E, _a<.java.util.Collections$AsLIFOQueue |
_d<._E, _a<.java.util.ArrayList$SubList$1 |
_d<.java.security.Permission, _a<.java.security.AllPermissionCollection |
_d<.com.sun.org.apache.xml.internal.security.keys.content.keyvalues.DSAKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.jdk.internal.org.objectweb.asm.tree.AbstractInsnNode, _a<.jdk.internal.org.objectweb.asm.tree.InsnList |
_d<.long, _a<.java.util.stream.LongStream$Builder |
_d<._K, _a<.java.util.concurrent.ConcurrentHashMap$KeySetView |
_d<.java.security.Permission, _a<.java.net.SocketPermissionCollection |
_d<.com.sun.org.apache.xml.internal.security.keys.content.SPKIData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.javax.print.attribute.standard.JobStateReason, _a<.javax.print.attribute.standard.JobStateReasons |
_d<._E, _a<.java.util.concurrent.ArrayBlockingQueue |
_d<.javax.swing.Action, _a<.javax.swing.JPopupMenu |
_d<.com.sun.org.apache.xml.internal.security.keys.content.X509Data, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.java.awt.PopupMenu, _a<.java.awt.Component |
_d<.java.lang.Object, _a<.com.sun.jndi.ldap.LdapAttribute |
_d<._E, _a<.java.util.LinkedList$ListItr |
_d<.sun.security.util.math.IntegerModuloP, _a<.sun.security.util.math.IntegerModuloP |
_d<._E, _a<.sun.awt.util.IdentityArrayList |
_d<.java.security.Permission, _a<.javax.security.auth.kerberos.KrbDelegationPermissionCollection |
_d<.java.lang.String, _a<.java.awt.Menu |
_d<.java.lang.Object, _a<.javax.management.relation.RoleUnresolvedList |
_d<.short, _a<.java.awt.image.renderable.ParameterBlock |
_d<.float, _a<.java.awt.image.renderable.ParameterBlock |
_d<._E, _a<.java.util.concurrent.CopyOnWriteArrayList |
_d<.java.lang.Object, _a<.javax.print.attribute.standard.JobStateReasons |
_d<.javax.xml.stream.XMLEventReader, _a<.com.sun.xml.internal.stream.writers.XMLEventWriterImpl |
_d<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509IssuerSerial, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_d<._E, _a<.java.util.Queue |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintRequestAttributeSet |
_d<.int, _a<.sun.java2d.marlin.stats.StatLong |
_d<.com.sun.org.apache.xml.internal.security.keys.content.DEREncodedKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.com.sun.org.apache.xml.internal.security.keys.content.KeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.java.lang.Object, _a<.javax.management.AttributeList |
_d<.sun.security.x509.GeneralSubtree, _a<.sun.security.x509.GeneralSubtrees }
@@ -1,665 +0,0 @@
{ _b<.java.security.Permission, _a<.java.util.PropertyPermissionCollection |
_b<.int, _a<.sun.java2d.marlin.stats.Histogram |
_b<.java.lang.Object, _a<.com.sun.jndi.ldap.LdapAttribute |
_b<.java.math.BigInteger, _a<.java.math.BigInteger |
_b<.java.lang.Object, _a<.com.sun.org.apache.xerces.internal.impl.xs.XSModelImpl$XSNamespaceItemListIterator |
_b<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolverSpi, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_b<._E, _a<.java.util.AbstractList |
_b<._E, _a<.java.util.HashSet |
_b<.sun.security.util.math.IntegerModuloP, _a<.sun.security.util.math.intpoly.IntegerPolynomial$Element |
_b<.java.awt.geom.Point2D, _a<.java.awt.geom.Rectangle2D |
_b<._E, _a<.java.util.AbstractQueue |
_b<.double, _a<.java.util.concurrent.atomic.DoubleAdder |
_b<._E, _a<.java.util.Collections$AsLIFOQueue |
_b<.com.sun.org.apache.xml.internal.security.keys.content.keyvalues.DSAKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<._E, _a<.java.util.Collections$EmptyListIterator |
_b<._E, _a<.java.util.AbstractList$ListItr |
_b<.java.math.BigDecimal, _a<.java.math.BigDecimal |
_b<._E, _a<.java.util.Collections$CheckedList$1 |
_b<.sun.security.provider.PolicyParser$GrantEntry, _a<.sun.security.provider.PolicyParser |
_b<._T_array, _a<.sun.swing.AccumulativeRunnable |
_b<._T, _a<.com.sun.jmx.remote.internal.ArrayQueue |
_b<.javax.management.relation.Role, _a<.javax.management.relation.RoleList |
_b<.java.lang.String, _a<.javax.naming.Name |
_b<.javax.xml.datatype.Duration, _a<.javax.xml.datatype.Duration |
_b<._E, _a<.java.util.concurrent.ConcurrentSkipListSet |
_b<.javax.accessibility.AccessibleRelation, _a<.javax.accessibility.AccessibleRelationSet |
_b<.java.awt.RenderingHints, _a<.java.awt.RenderingHints |
_b<.java.lang.Object, _a<.java.util.JumboEnumSet |
_b<.javax.xml.datatype.Duration, _a<.com.sun.org.apache.xerces.internal.jaxp.datatype.DurationImpl |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSetUtilities$UnmodifiableAttributeSet |
_b<.java.awt.geom.Rectangle2D, _a<.java.awt.geom.Rectangle2D |
_b<.java.awt.TrayIcon, _a<.java.awt.SystemTray |
_b<.java.awt.Component, _a<.sun.awt.X11.InfoWindow |
_b<.javax.sound.midi.MidiEvent, _a<.javax.sound.midi.Track |
_b<.java.awt.Component, _a<.javax.swing.JMenu |
_b<.com.sun.org.apache.bcel.internal.classfile.JavaClass, _a<.com.sun.org.apache.bcel.internal.util.ClassSet |
_b<.java.awt.Component, _a<.javax.swing.JTabbedPane |
_b<.java.lang.Object, _a<.javax.management.relation.RoleList |
_b<._T, _a<.java.util.stream.Stream$Builder |
_b<._K, _a<.java.util.concurrent.ConcurrentHashMap$KeySetView |
_b<._E, _a<.sun.nio.ch.Util$2 |
_b<.char, _a<.java.awt.image.renderable.ParameterBlock |
_b<._E, _a<.java.util.concurrent.LinkedTransferQueue |
_b<.com.sun.org.apache.xml.internal.security.keys.content.KeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.com.sun.org.apache.xml.internal.security.keys.content.PGPData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.int, _a<.com.sun.org.apache.xalan.internal.xsltc.util.IntegerArray |
_b<.java.lang.Runnable, _a<.java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue |
_b<.java.awt.geom.Area, _a<.java.awt.geom.Area |
_b<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SubjectName, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_b<._E, _a<.java.util.Vector |
_b<.java.security.Permission, _a<.javax.management.MBeanServerPermissionCollection |
_b<.long, _a<.sun.java2d.xr.XcbRequestCounter |
_b<.java.lang.Object, _a<.sun.tools.jar.Main$1 |
_b<.int, _a<.sun.java2d.marlin.stats.StatLong |
_b<.java.lang.String, _a<.java.awt.List |
_b<.java.lang.String, _a<.javax.naming.CompositeName |
_b<.jdk.internal.org.objectweb.asm.tree.InsnList, _a<.jdk.internal.org.objectweb.asm.tree.InsnList |
_b<._E, _a<.sun.awt.util.IdentityArrayList |
_b<._E, _a<.javax.security.auth.Subject$SecureSet |
_b<._E, _a<.java.util.JumboEnumSet |
_b<._E, _a<.java.util.PriorityQueue |
_b<.com.sun.org.apache.xml.internal.security.keys.content.DEREncodedKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.javax.swing.AbstractButton, _a<.javax.swing.ButtonGroup |
_b<.int, _a<.java.util.stream.IntStream$Builder |
_b<.java.lang.String, _a<.javax.swing.JMenu |
_b<.com.sun.org.apache.xml.internal.security.keys.content.MgmtData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.javax.xml.stream.XMLEventReader, _a<.com.sun.xml.internal.stream.writers.XMLEventWriterImpl |
_b<.java.lang.Object, _a<.javax.management.AttributeList |
_b<._E, _a<.java.util.RegularEnumSet |
_b<._E, _a<.java.util.Collections$CheckedCollection |
_b<._T, _a<.javax.security.auth.Subject$ClassSet |
_b<.java.security.Permission, _a<.java.security.PermissionCollection |
_b<.jdk.internal.org.objectweb.asm.tree.AbstractInsnNode, _a<.jdk.internal.org.objectweb.asm.tree.InsnList |
_b<.java.lang.Object, _a<.com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl$XSObjectListIterator |
_b<.java.security.Permission, _a<.java.security.PermissionsHash |
_b<.java.lang.Object, _a<.java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue |
_b<.double, _a<.java.util.stream.DoubleStream$Builder |
_b<.com.sun.org.apache.xml.internal.security.keys.content.keyvalues.RSAKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.long, _a<.sun.java2d.marlin.stats.StatLong |
_b<.javax.xml.datatype.Duration, _a<.com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl |
_b<.java.security.Permission, _a<.java.security.AllPermissionCollection |
_b<.sun.awt.X11.XAtom, _a<.sun.awt.X11.XAtomList |
_b<.javax.swing.Action, _a<.javax.swing.JPopupMenu |
_b<.java.lang.Object, _a<.java.util.Hashtable$EntrySet |
_b<.java.security.Permission, _a<.java.security.UnresolvedPermissionCollection |
_b<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509Digest, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_b<.javax.management.relation.RoleUnresolved, _a<.javax.management.relation.RoleUnresolvedList |
_b<.java.lang.Object, _a<.javax.print.attribute.standard.JobStateReasons |
_b<._E, _a<.java.util.Collections$UnmodifiableList$1 |
_b<._E, _a<.java.util.Deque |
_b<._E, _a<.java.util.Collection |
_b<._E, _a<.javax.imageio.spi.PartiallyOrderedSet |
_b<.sun.security.x509.GeneralSubtree, _a<.sun.security.x509.GeneralSubtrees |
_b<.long, _a<.java.util.concurrent.atomic.LongAdder |
_b<.java.awt.Menu, _a<.java.awt.MenuBar |
_b<.com.sun.org.apache.xml.internal.security.keys.content.X509Data, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.java.awt.Point, _a<.java.awt.Rectangle |
_b<.java.security.Permission, _a<.javax.security.auth.kerberos.KrbDelegationPermissionCollection |
_b<.javax.xml.stream.events.XMLEvent, _a<.javax.xml.stream.XMLEventWriter |
_b<.com.sun.org.apache.xml.internal.security.keys.content.KeyInfoReference, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintJobAttributeSet |
_b<.com.sun.org.apache.xml.internal.security.keys.content.SPKIData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.java.security.Permission, _a<.java.security.BasicPermissionCollection |
_b<._E, _a<.java.util.concurrent.BlockingDeque |
_b<.sun.net.httpserver.HttpContextImpl, _a<.sun.net.httpserver.ContextList |
_b<._E, _a<.java.util.concurrent.ConcurrentLinkedDeque |
_b<._E, _a<.java.util.Collections$SetFromMap |
_b<.javax.swing.JMenuItem, _a<.javax.swing.JPopupMenu |
_b<.java.awt.MenuItem, _a<.java.awt.Menu |
_b<.java.lang.Object, _a<.java.beans.beancontext.BeanContextSupport |
_b<.java.lang.String, _a<.com.sun.org.apache.xerces.internal.dom.DOMStringListImpl |
_b<.short, _a<.com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$ShortVector |
_b<.javax.xml.stream.XMLEventReader, _a<.javax.xml.stream.XMLEventWriter |
_b<.java.lang.String, _a<.com.sun.jndi.dns.DnsName |
_b<._E, _a<.java.util.ListIterator |
_b<._E, _a<.java.util.LinkedList |
_b<.long, _a<.sun.java2d.marlin.stats.Histogram |
_b<._E, _a<.java.util.concurrent.DelayQueue |
_b<.java.security.Permission, _a<.java.net.SocketPermissionCollection |
_b<.java.security.Permission, _a<.java.security.Policy$UnsupportedEmptyCollection |
_b<._E, _a<.java.util.concurrent.CopyOnWriteArrayList |
_b<.java.lang.String, _a<.javax.naming.CompoundName |
_b<._E, _a<.java.util.List |
_b<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWIterator |
_b<.javax.swing.JMenuItem, _a<.javax.swing.JMenu |
_b<.java.security.Permission, _a<.java.security.Permissions |
_b<.java.security.KeyStore, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_b<.long, _a<.java.util.stream.LongStream$Builder |
_b<._E, _a<.java.util.AbstractCollection |
_b<.[Lcom.sun.media.sound.ModelPerformer;, _a<.com.sun.media.sound.SimpleInstrument |
_b<.java.security.cert.X509Certificate, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_b<._E, _a<.java.util.concurrent.PriorityBlockingQueue |
_b<.com.sun.org.apache.xerces.internal.xs.XSObject, _a<.com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl$XSObjectListIterator |
_b<.java.lang.CharSequence, _a<.java.util.StringJoiner |
_b<._E, _a<.java.util.concurrent.ArrayBlockingQueue |
_b<.javax.swing.JMenu, _a<.javax.swing.JMenuBar |
_b<.java.lang.Object, _a<.java.util.RegularEnumSet |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSetUtilities$SynchronizedAttributeSet |
_b<.java.lang.String, _a<.javax.swing.JPopupMenu |
_b<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509Certificate, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_b<._E, _a<.java.util.ArrayList$ListItr |
_b<.com.sun.org.apache.xml.internal.security.keys.content.KeyName, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.javax.accessibility.AccessibleState, _a<.javax.accessibility.AccessibleStateSet |
_b<.javax.naming.RefAddr, _a<.javax.naming.Reference |
_b<.java.lang.String, _a<.javax.naming.NameImpl |
_b<.javax.xml.stream.events.XMLEvent, _a<.javax.xml.stream.util.XMLEventConsumer |
_b<.sun.security.util.math.IntegerModuloP, _a<.sun.security.util.math.IntegerModuloP |
_b<._E, _a<.java.util.ArrayList |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintServiceAttributeSet |
_b<.java.lang.Object, _a<.javax.naming.directory.BasicAttribute |
_b<._E, _a<.java.util.concurrent.ConcurrentLinkedQueue |
_b<.int, _a<.java.io.ObjectInputStream$HandleTable$HandleList |
_b<.java.lang.String, _a<.java.awt.Choice |
_b<.java.lang.Object, _a<.javax.management.relation.RoleUnresolvedList |
_b<.com.sun.org.apache.bcel.internal.generic.InstructionHandle, _a<.com.sun.org.apache.xalan.internal.xsltc.compiler.FlowList |
_b<.java.io.File, _a<.sun.font.CreatedFontTracker |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.HashAttributeSet |
_b<._E, _a<.java.util.LinkedList$ListItr |
_b<.javax.naming.ldap.Rdn, _a<.javax.naming.ldap.LdapName |
_b<.jdk.internal.org.objectweb.asm.Type, _a<.jdk.internal.org.objectweb.asm.commons.InstructionAdapter |
_b<._E, _a<.java.util.Set |
_b<.java.security.Permission, _a<.javax.security.auth.kerberos.KrbServicePermissionCollection |
_b<.com.sun.org.apache.xml.internal.security.keys.content.RetrievalMethod, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.short, _a<.java.awt.image.renderable.ParameterBlock |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintRequestAttributeSet |
_b<.float, _a<.java.awt.image.renderable.ParameterBlock |
_b<._E, _a<.java.util.concurrent.LinkedBlockingDeque |
_b<.javax.swing.Action, _a<.javax.swing.JToolBar |
_b<.java.lang.String, _a<.javax.naming.ldap.LdapName |
_b<._E, _a<.java.util.Collections$SynchronizedCollection |
_b<._E, _a<.java.util.Queue |
_b<.javax.swing.Action, _a<.javax.swing.JMenu |
_b<.java.awt.Component, _a<.java.awt.Container |
_b<._E, _a<.java.util.TreeSet |
_b<.javax.xml.stream.events.XMLEvent, _a<.com.sun.xml.internal.stream.writers.XMLEventWriterImpl |
_b<.java.security.PublicKey, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_b<.java.awt.PopupMenu, _a<.java.awt.Component |
_b<.com.sun.org.apache.xerces.internal.xs.XSNamespaceItem, _a<.com.sun.org.apache.xerces.internal.impl.xs.XSModelImpl$XSNamespaceItemListIterator |
_b<.int, _a<.java.awt.image.renderable.ParameterBlock |
_b<.sun.net.www.MimeEntry, _a<.sun.net.www.MimeTable |
_b<._E, _a<.java.util.concurrent.CopyOnWriteArraySet |
_b<.java.awt.Rectangle, _a<.java.awt.Rectangle |
_b<.java.lang.String, _a<.com.sun.jndi.ldap.LdapName |
_b<._E, _a<.java.util.Collections$UnmodifiableCollection |
_b<.javax.swing.GroupLayout$ComponentInfo, _a<.javax.swing.GroupLayout$LinkInfo |
_b<._E, _a<.java.util.Vector$ListItr |
_b<.long, _a<.java.awt.image.renderable.ParameterBlock |
_b<._E, _a<.java.util.concurrent.BlockingQueue |
_b<._T, _a<.java.util.stream.Streams$StreamBuilderImpl |
_b<.byte, _a<.java.awt.image.renderable.ParameterBlock |
_b<.sun.awt.DisplayChangedListener, _a<.sun.awt.SunDisplayChanger |
_b<.com.sun.media.sound.ModelPerformer, _a<.com.sun.media.sound.SimpleInstrument |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.DocAttributeSet |
_b<._V, _a<.java.util.concurrent.ConcurrentHashMap$ValuesView |
_b<.com.sun.media.sound.ModelInstrument, _a<.com.sun.media.sound.SimpleInstrument |
_b<.java.lang.Object, _a<.java.util.concurrent.DelayQueue |
_b<.sun.security.x509.GeneralName, _a<.sun.security.x509.GeneralNames |
_b<.sun.security.provider.PolicyParser$PermissionEntry, _a<.sun.security.provider.PolicyParser$GrantEntry |
_b<._E, _a<.java.util.ArrayList$SubList$1 |
_b<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSet |
_b<.java.lang.Object, _a<.javax.naming.directory.Attribute |
_b<.java.lang.Object, _a<.jdk.internal.org.objectweb.asm.tree.MethodNode$1 |
_b<.java.security.Permission, _a<.java.io.FilePermissionCollection |
_b<.java.util.zip.ZipEntry, _a<.sun.tools.jar.Main$1 |
_b<.java.lang.String, _a<.java.awt.Menu |
_b<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWSubList |
_b<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SKI, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_b<.javax.xml.datatype.Duration, _a<.javax.xml.datatype.XMLGregorianCalendar |
_b<.java.lang.Object, _a<.java.util.concurrent.ConcurrentHashMap$EntrySetView |
_b<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509IssuerSerial, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_b<.javax.swing.tree.MutableTreeNode, _a<.javax.swing.tree.DefaultMutableTreeNode |
_b<.sun.awt.image.ImageFetchable, _a<.sun.awt.image.ImageFetcher |
_b<.javax.management.Attribute, _a<.javax.management.AttributeList |
_b<.double, _a<.java.awt.image.renderable.ParameterBlock |
_b<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWSubListIterator |
_b<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509CRL, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_b<.java.lang.Object, _a<.jdk.internal.org.objectweb.asm.tree.InsnList$InsnListIterator |
_b<.java.lang.Object, _a<.java.util.Collections$CheckedMap$CheckedEntrySet |
_b<.java.lang.Object, _a<.java.awt.image.renderable.ParameterBlock |
_b<.javax.print.attribute.standard.JobStateReason, _a<.javax.print.attribute.standard.JobStateReasons |
_b<._E, _a<.java.util.ArrayDeque }
{ _c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.HashAttributeSet |
_c<.javax.swing.GroupLayout$ComponentInfo, _a<.javax.swing.GroupLayout$LinkInfo |
_c<._E, _a<.java.util.ArrayList$SubList$1 |
_c<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SKI, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_c<.java.lang.Object, _a<.java.util.concurrent.ConcurrentHashMap$EntrySetView |
_c<._E, _a<.java.util.Set |
_c<._E, _a<.java.util.ArrayList$ListItr |
_c<.java.awt.geom.Point2D, _a<.java.awt.geom.Rectangle2D |
_c<.javax.xml.datatype.Duration, _a<.com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl |
_c<.int, _a<.java.awt.image.renderable.ParameterBlock |
_c<.java.security.Permission, _a<.java.util.PropertyPermissionCollection |
_c<.javax.swing.Action, _a<.javax.swing.JMenu |
_c<.com.sun.org.apache.xml.internal.security.keys.content.SPKIData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<._E, _a<.java.util.concurrent.ConcurrentSkipListSet |
_c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSetUtilities$UnmodifiableAttributeSet |
_c<.java.util.zip.ZipEntry, _a<.sun.tools.jar.Main$1 |
_c<.java.security.Permission, _a<.javax.management.MBeanServerPermissionCollection |
_c<.java.security.Permission, _a<.java.security.UnresolvedPermissionCollection |
_c<._V, _a<.java.util.concurrent.ConcurrentHashMap$ValuesView |
_c<.int, _a<.sun.java2d.marlin.stats.StatLong |
_c<._E, _a<.java.util.Collections$CheckedList$1 |
_c<.java.lang.String, _a<.javax.naming.Name |
_c<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolverSpi, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSet |
_c<.javax.management.relation.RoleUnresolved, _a<.javax.management.relation.RoleUnresolvedList |
_c<.java.awt.Component, _a<.javax.swing.JMenu |
_c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintJobAttributeSet |
_c<._E, _a<.java.util.ArrayList |
_c<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SubjectName, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_c<.java.lang.Object, _a<.javax.print.attribute.standard.JobStateReasons |
_c<.char, _a<.java.awt.image.renderable.ParameterBlock |
_c<.java.awt.Point, _a<.java.awt.Rectangle |
_c<.javax.management.relation.Role, _a<.javax.management.relation.RoleList |
_c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintServiceAttributeSet |
_c<._E, _a<.java.util.Vector$ListItr |
_c<.javax.xml.datatype.Duration, _a<.javax.xml.datatype.XMLGregorianCalendar |
_c<.javax.swing.Action, _a<.javax.swing.JPopupMenu |
_c<.long, _a<.java.util.concurrent.atomic.LongAdder |
_c<.sun.security.util.math.IntegerModuloP, _a<.sun.security.util.math.intpoly.IntegerPolynomial$Element |
_c<.java.awt.TrayIcon, _a<.java.awt.SystemTray |
_c<.java.lang.Object, _a<.javax.management.AttributeList |
_c<.java.lang.String, _a<.javax.naming.CompositeName |
_c<.short, _a<.com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$ShortVector |
_c<.com.sun.org.apache.xerces.internal.xs.XSObject, _a<.com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl$XSObjectListIterator |
_c<._T, _a<.javax.security.auth.Subject$ClassSet |
_c<.sun.security.provider.PolicyParser$GrantEntry, _a<.sun.security.provider.PolicyParser |
_c<._K, _a<.java.util.concurrent.ConcurrentHashMap$KeySetView |
_c<.[Lcom.sun.media.sound.ModelPerformer;, _a<.com.sun.media.sound.SimpleInstrument |
_c<.java.awt.Component, _a<.java.awt.Container |
_c<.java.lang.Object, _a<.javax.naming.directory.BasicAttribute |
_c<._E, _a<.java.util.LinkedList |
_c<._E, _a<.sun.awt.util.IdentityArrayList |
_c<.javax.naming.ldap.Rdn, _a<.javax.naming.ldap.LdapName |
_c<.double, _a<.java.awt.image.renderable.ParameterBlock |
_c<._E, _a<.java.util.Collections$AsLIFOQueue |
_c<.com.sun.org.apache.xml.internal.security.keys.content.MgmtData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<._E, _a<.java.util.Collections$SetFromMap |
_c<.java.lang.String, _a<.com.sun.jndi.dns.DnsName |
_c<.java.lang.Object, _a<.javax.management.relation.RoleUnresolvedList |
_c<.sun.security.x509.GeneralName, _a<.sun.security.x509.GeneralNames |
_c<.sun.awt.X11.XAtom, _a<.sun.awt.X11.XAtomList |
_c<.javax.xml.stream.XMLEventReader, _a<.com.sun.xml.internal.stream.writers.XMLEventWriterImpl |
_c<.java.lang.Object, _a<.com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl$XSObjectListIterator |
_c<.java.lang.Object, _a<.java.util.JumboEnumSet |
_c<._E, _a<.java.util.AbstractList$ListItr |
_c<.javax.xml.datatype.Duration, _a<.javax.xml.datatype.Duration |
_c<.javax.swing.JMenuItem, _a<.javax.swing.JPopupMenu |
_c<.java.lang.Object, _a<.com.sun.org.apache.xerces.internal.impl.xs.XSModelImpl$XSNamespaceItemListIterator |
_c<.java.lang.String, _a<.com.sun.jndi.ldap.LdapName |
_c<.java.security.KeyStore, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_c<.java.math.BigDecimal, _a<.java.math.BigDecimal |
_c<.short, _a<.java.awt.image.renderable.ParameterBlock |
_c<.float, _a<.java.awt.image.renderable.ParameterBlock |
_c<.java.security.Permission, _a<.java.security.PermissionCollection |
_c<._E, _a<.javax.security.auth.Subject$SecureSet |
_c<.java.awt.PopupMenu, _a<.java.awt.Component |
_c<.java.awt.Rectangle, _a<.java.awt.Rectangle |
_c<.com.sun.media.sound.ModelPerformer, _a<.com.sun.media.sound.SimpleInstrument |
_c<.javax.swing.Action, _a<.javax.swing.JToolBar |
_c<._E, _a<.java.util.concurrent.ConcurrentLinkedDeque |
_c<._E, _a<.java.util.Collections$UnmodifiableCollection |
_c<._E, _a<.java.util.Queue |
_c<.java.lang.String, _a<.javax.naming.ldap.LdapName |
_c<.java.lang.Runnable, _a<.java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue |
_c<.jdk.internal.org.objectweb.asm.tree.InsnList, _a<.jdk.internal.org.objectweb.asm.tree.InsnList |
_c<.sun.net.www.MimeEntry, _a<.sun.net.www.MimeTable |
_c<.com.sun.org.apache.xml.internal.security.keys.content.keyvalues.DSAKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<.java.awt.Menu, _a<.java.awt.MenuBar |
_c<._E, _a<.java.util.ArrayDeque |
_c<._E, _a<.java.util.List |
_c<._E, _a<.java.util.JumboEnumSet |
_c<.java.io.File, _a<.sun.font.CreatedFontTracker |
_c<.sun.net.httpserver.HttpContextImpl, _a<.sun.net.httpserver.ContextList |
_c<._E, _a<.java.util.AbstractQueue |
_c<.double, _a<.java.util.concurrent.atomic.DoubleAdder |
_c<.javax.print.attribute.standard.JobStateReason, _a<.javax.print.attribute.standard.JobStateReasons |
_c<.java.awt.RenderingHints, _a<.java.awt.RenderingHints |
_c<.long, _a<.java.awt.image.renderable.ParameterBlock |
_c<._E, _a<.java.util.concurrent.PriorityBlockingQueue |
_c<._E, _a<.java.util.AbstractList |
_c<.java.security.Permission, _a<.javax.security.auth.kerberos.KrbServicePermissionCollection |
_c<.java.awt.geom.Rectangle2D, _a<.java.awt.geom.Rectangle2D |
_c<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509IssuerSerial, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_c<.java.lang.Object, _a<.javax.management.relation.RoleList |
_c<.double, _a<.java.util.stream.DoubleStream$Builder |
_c<._E, _a<.java.util.AbstractCollection |
_c<.byte, _a<.java.awt.image.renderable.ParameterBlock |
_c<.java.security.Permission, _a<.java.net.SocketPermissionCollection |
_c<.javax.naming.RefAddr, _a<.javax.naming.Reference |
_c<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509Certificate, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_c<.java.lang.Object, _a<.java.util.Collections$CheckedMap$CheckedEntrySet |
_c<._E, _a<.java.util.TreeSet |
_c<.java.security.Permission, _a<.java.io.FilePermissionCollection |
_c<.java.security.Permission, _a<.java.security.Policy$UnsupportedEmptyCollection |
_c<._E, _a<.java.util.Collections$SynchronizedCollection |
_c<._E, _a<.java.util.Collections$UnmodifiableList$1 |
_c<.com.sun.org.apache.xml.internal.security.keys.content.X509Data, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<._E, _a<.sun.nio.ch.Util$2 |
_c<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWSubListIterator |
_c<.java.security.Permission, _a<.java.security.Permissions |
_c<._E, _a<.java.util.Collections$CheckedCollection |
_c<.sun.security.util.math.IntegerModuloP, _a<.sun.security.util.math.IntegerModuloP |
_c<._E, _a<.java.util.Deque |
_c<._E, _a<.java.util.LinkedList$ListItr |
_c<.java.lang.String, _a<.java.awt.Choice |
_c<._E, _a<.java.util.concurrent.ConcurrentLinkedQueue |
_c<._E, _a<.java.util.Vector |
_c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.DocAttributeSet |
_c<.java.lang.Object, _a<.java.beans.beancontext.BeanContextSupport |
_c<._E, _a<.javax.imageio.spi.PartiallyOrderedSet |
_c<.java.lang.String, _a<.javax.naming.NameImpl |
_c<._E, _a<.java.util.concurrent.LinkedBlockingDeque |
_c<.java.lang.String, _a<.java.awt.List |
_c<._E, _a<.java.util.concurrent.DelayQueue |
_c<.java.lang.Object, _a<.jdk.internal.org.objectweb.asm.tree.InsnList$InsnListIterator |
_c<.javax.swing.AbstractButton, _a<.javax.swing.ButtonGroup |
_c<.java.security.PublicKey, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509Digest, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_c<.java.awt.Component, _a<.javax.swing.JTabbedPane |
_c<.java.lang.Object, _a<.java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue |
_c<.long, _a<.sun.java2d.marlin.stats.Histogram |
_c<._E, _a<.java.util.concurrent.BlockingQueue |
_c<.jdk.internal.org.objectweb.asm.tree.AbstractInsnNode, _a<.jdk.internal.org.objectweb.asm.tree.InsnList |
_c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSetUtilities$SynchronizedAttributeSet |
_c<.java.lang.Object, _a<.java.util.concurrent.DelayQueue |
_c<.java.security.Permission, _a<.java.security.PermissionsHash |
_c<.javax.swing.JMenu, _a<.javax.swing.JMenuBar |
_c<.long, _a<.java.util.stream.LongStream$Builder |
_c<.javax.accessibility.AccessibleState, _a<.javax.accessibility.AccessibleStateSet |
_c<.javax.xml.stream.XMLEventReader, _a<.javax.xml.stream.XMLEventWriter |
_c<.long, _a<.sun.java2d.xr.XcbRequestCounter |
_c<.java.security.Permission, _a<.javax.security.auth.kerberos.KrbDelegationPermissionCollection |
_c<.com.sun.org.apache.bcel.internal.classfile.JavaClass, _a<.com.sun.org.apache.bcel.internal.util.ClassSet |
_c<.java.awt.geom.Area, _a<.java.awt.geom.Area |
_c<.com.sun.org.apache.xml.internal.security.keys.content.KeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWIterator |
_c<.sun.awt.DisplayChangedListener, _a<.sun.awt.SunDisplayChanger |
_c<._T, _a<.java.util.stream.Streams$StreamBuilderImpl |
_c<.java.lang.String, _a<.javax.naming.CompoundName |
_c<._E, _a<.java.util.Collections$EmptyListIterator |
_c<.sun.security.provider.PolicyParser$PermissionEntry, _a<.sun.security.provider.PolicyParser$GrantEntry |
_c<.java.lang.Object, _a<.javax.naming.directory.Attribute |
_c<._E, _a<.java.util.ListIterator |
_c<.java.security.Permission, _a<.java.security.AllPermissionCollection |
_c<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWSubList |
_c<.java.lang.String, _a<.javax.swing.JPopupMenu |
_c<.sun.security.x509.GeneralSubtree, _a<.sun.security.x509.GeneralSubtrees |
_c<.java.lang.Object, _a<.java.util.Hashtable$EntrySet |
_c<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509CRL, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_c<.javax.xml.stream.events.XMLEvent, _a<.com.sun.xml.internal.stream.writers.XMLEventWriterImpl |
_c<.javax.xml.datatype.Duration, _a<.com.sun.org.apache.xerces.internal.jaxp.datatype.DurationImpl |
_c<.javax.swing.tree.MutableTreeNode, _a<.javax.swing.tree.DefaultMutableTreeNode |
_c<.com.sun.org.apache.xml.internal.security.keys.content.DEREncodedKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<._E, _a<.java.util.concurrent.BlockingDeque |
_c<.long, _a<.sun.java2d.marlin.stats.StatLong |
_c<.java.math.BigInteger, _a<.java.math.BigInteger |
_c<._E, _a<.java.util.concurrent.CopyOnWriteArrayList |
_c<.java.security.cert.X509Certificate, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_c<._E, _a<.java.util.concurrent.CopyOnWriteArraySet |
_c<.javax.management.Attribute, _a<.javax.management.AttributeList |
_c<.java.lang.Object, _a<.java.util.RegularEnumSet |
_c<.java.lang.String, _a<.javax.swing.JMenu |
_c<.java.lang.Object, _a<.com.sun.jndi.ldap.LdapAttribute |
_c<.javax.xml.stream.events.XMLEvent, _a<.javax.xml.stream.util.XMLEventConsumer |
_c<.java.lang.String, _a<.com.sun.org.apache.xerces.internal.dom.DOMStringListImpl |
_c<.java.security.Permission, _a<.java.security.BasicPermissionCollection |
_c<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintRequestAttributeSet |
_c<._E, _a<.java.util.concurrent.LinkedTransferQueue |
_c<.java.lang.Object, _a<.sun.tools.jar.Main$1 |
_c<._E, _a<.java.util.RegularEnumSet |
_c<.sun.awt.image.ImageFetchable, _a<.sun.awt.image.ImageFetcher |
_c<.java.lang.Object, _a<.java.awt.image.renderable.ParameterBlock |
_c<.com.sun.org.apache.xml.internal.security.keys.content.PGPData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<.javax.xml.stream.events.XMLEvent, _a<.javax.xml.stream.XMLEventWriter |
_c<.java.awt.MenuItem, _a<.java.awt.Menu |
_c<.com.sun.org.apache.xerces.internal.xs.XSNamespaceItem, _a<.com.sun.org.apache.xerces.internal.impl.xs.XSModelImpl$XSNamespaceItemListIterator |
_c<.javax.accessibility.AccessibleRelation, _a<.javax.accessibility.AccessibleRelationSet |
_c<.com.sun.org.apache.xml.internal.security.keys.content.keyvalues.RSAKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<.int, _a<.java.util.stream.IntStream$Builder |
_c<.java.lang.Object, _a<.jdk.internal.org.objectweb.asm.tree.MethodNode$1 |
_c<.int, _a<.com.sun.org.apache.xalan.internal.xsltc.util.IntegerArray |
_c<.com.sun.media.sound.ModelInstrument, _a<.com.sun.media.sound.SimpleInstrument |
_c<.com.sun.org.apache.xml.internal.security.keys.content.RetrievalMethod, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<._T, _a<.java.util.stream.Stream$Builder |
_c<.jdk.internal.org.objectweb.asm.Type, _a<.jdk.internal.org.objectweb.asm.commons.InstructionAdapter |
_c<._E, _a<.java.util.PriorityQueue |
_c<.java.lang.String, _a<.java.awt.Menu |
_c<.int, _a<.sun.java2d.marlin.stats.Histogram |
_c<.int, _a<.java.io.ObjectInputStream$HandleTable$HandleList |
_c<.javax.swing.JMenuItem, _a<.javax.swing.JMenu |
_c<._E, _a<.java.util.HashSet |
_c<._E, _a<.java.util.concurrent.ArrayBlockingQueue |
_c<.javax.sound.midi.MidiEvent, _a<.javax.sound.midi.Track |
_c<.java.lang.CharSequence, _a<.java.util.StringJoiner |
_c<.com.sun.org.apache.xml.internal.security.keys.content.KeyInfoReference, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<.com.sun.org.apache.xml.internal.security.keys.content.KeyName, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_c<.com.sun.org.apache.bcel.internal.generic.InstructionHandle, _a<.com.sun.org.apache.xalan.internal.xsltc.compiler.FlowList |
_c<.java.awt.Component, _a<.sun.awt.X11.InfoWindow |
_c<._E, _a<.java.util.Collection |
_c<._T_array, _a<.sun.swing.AccumulativeRunnable |
_c<._T, _a<.com.sun.jmx.remote.internal.ArrayQueue }
{ _d<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SubjectName, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_d<._E, _a<.java.util.Collections$SetFromMap |
_d<.javax.swing.JMenuItem, _a<.javax.swing.JPopupMenu |
_d<.int, _a<.java.util.stream.IntStream$Builder |
_d<.java.awt.RenderingHints, _a<.java.awt.RenderingHints |
_d<.long, _a<.java.awt.image.renderable.ParameterBlock |
_d<.javax.accessibility.AccessibleState, _a<.javax.accessibility.AccessibleStateSet |
_d<._E, _a<.java.util.Collections$CheckedList$1 |
_d<.java.lang.Runnable, _a<.java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue |
_d<.java.lang.Object, _a<.java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue |
_d<.java.awt.geom.Point2D, _a<.java.awt.geom.Rectangle2D |
_d<.java.lang.String, _a<.javax.swing.JMenu |
_d<.java.lang.String, _a<.javax.naming.CompositeName |
_d<._E, _a<.java.util.AbstractQueue |
_d<.java.lang.String, _a<.com.sun.org.apache.xerces.internal.dom.DOMStringListImpl |
_d<.java.lang.String, _a<.java.awt.List |
_d<._E, _a<.java.util.Collection |
_d<.int, _a<.com.sun.org.apache.xalan.internal.xsltc.util.IntegerArray |
_d<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWIterator |
_d<.java.lang.Object, _a<.java.util.RegularEnumSet |
_d<.com.sun.org.apache.xerces.internal.xs.XSNamespaceItem, _a<.com.sun.org.apache.xerces.internal.impl.xs.XSModelImpl$XSNamespaceItemListIterator |
_d<.char, _a<.java.awt.image.renderable.ParameterBlock |
_d<.java.lang.String, _a<.javax.naming.CompoundName |
_d<.java.security.Permission, _a<.java.util.PropertyPermissionCollection |
_d<.[Lcom.sun.media.sound.ModelPerformer;, _a<.com.sun.media.sound.SimpleInstrument |
_d<.java.awt.Component, _a<.java.awt.Container |
_d<.sun.awt.image.ImageFetchable, _a<.sun.awt.image.ImageFetcher |
_d<._E, _a<.java.util.LinkedList |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSetUtilities$UnmodifiableAttributeSet |
_d<.java.lang.CharSequence, _a<.java.util.StringJoiner |
_d<.java.security.Permission, _a<.java.security.UnresolvedPermissionCollection |
_d<.java.lang.Object, _a<.com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl$XSObjectListIterator |
_d<.jdk.internal.org.objectweb.asm.Type, _a<.jdk.internal.org.objectweb.asm.commons.InstructionAdapter |
_d<.java.util.zip.ZipEntry, _a<.sun.tools.jar.Main$1 |
_d<._E, _a<.java.util.Collections$UnmodifiableCollection |
_d<.javax.management.relation.Role, _a<.javax.management.relation.RoleList |
_d<.javax.management.Attribute, _a<.javax.management.AttributeList |
_d<._T, _a<.java.util.stream.Stream$Builder |
_d<.java.security.Permission, _a<.javax.security.auth.kerberos.KrbServicePermissionCollection |
_d<.com.sun.org.apache.bcel.internal.generic.InstructionHandle, _a<.com.sun.org.apache.xalan.internal.xsltc.compiler.FlowList |
_d<.javax.naming.ldap.Rdn, _a<.javax.naming.ldap.LdapName |
_d<.long, _a<.java.util.concurrent.atomic.LongAdder |
_d<.java.lang.Object, _a<.javax.management.relation.RoleList |
_d<._E, _a<.java.util.concurrent.LinkedTransferQueue |
_d<.java.security.Permission, _a<.java.security.PermissionsHash |
_d<.java.lang.Object, _a<.jdk.internal.org.objectweb.asm.tree.InsnList$InsnListIterator |
_d<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509Certificate, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_d<.java.lang.String, _a<.com.sun.jndi.dns.DnsName |
_d<.javax.xml.stream.events.XMLEvent, _a<.com.sun.xml.internal.stream.writers.XMLEventWriterImpl |
_d<.java.awt.Component, _a<.javax.swing.JMenu |
_d<._E, _a<.java.util.TreeSet |
_d<.java.awt.Menu, _a<.java.awt.MenuBar |
_d<.int, _a<.java.io.ObjectInputStream$HandleTable$HandleList |
_d<.sun.security.x509.GeneralName, _a<.sun.security.x509.GeneralNames |
_d<.javax.swing.Action, _a<.javax.swing.JMenu |
_d<.com.sun.org.apache.bcel.internal.classfile.JavaClass, _a<.com.sun.org.apache.bcel.internal.util.ClassSet |
_d<.short, _a<.com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$ShortVector |
_d<._E, _a<.java.util.Collections$CheckedCollection |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSetUtilities$SynchronizedAttributeSet |
_d<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509Digest, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_d<._E, _a<.java.util.concurrent.LinkedBlockingDeque |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.HashAttributeSet |
_d<.java.security.PublicKey, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<._E, _a<.java.util.Deque |
_d<._E, _a<.java.util.PriorityQueue |
_d<.double, _a<.java.util.stream.DoubleStream$Builder |
_d<.sun.awt.DisplayChangedListener, _a<.sun.awt.SunDisplayChanger |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.AttributeSet |
_d<.sun.security.provider.PolicyParser$PermissionEntry, _a<.sun.security.provider.PolicyParser$GrantEntry |
_d<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509CRL, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_d<._E, _a<.java.util.AbstractCollection |
_d<.javax.xml.stream.events.XMLEvent, _a<.javax.xml.stream.util.XMLEventConsumer |
_d<._E, _a<.java.util.concurrent.BlockingDeque |
_d<.javax.xml.datatype.Duration, _a<.javax.xml.datatype.XMLGregorianCalendar |
_d<._E, _a<.java.util.concurrent.ConcurrentLinkedQueue |
_d<.java.security.Permission, _a<.java.security.Permissions |
_d<.java.lang.Object, _a<.java.util.concurrent.ConcurrentHashMap$EntrySetView |
_d<._E, _a<.java.util.AbstractList |
_d<.int, _a<.sun.java2d.marlin.stats.Histogram |
_d<.java.io.File, _a<.sun.font.CreatedFontTracker |
_d<.java.lang.Object, _a<.java.util.JumboEnumSet |
_d<._T, _a<.java.util.stream.Streams$StreamBuilderImpl |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintServiceAttributeSet |
_d<._E, _a<.java.util.ArrayList |
_d<.javax.accessibility.AccessibleRelation, _a<.javax.accessibility.AccessibleRelationSet |
_d<.double, _a<.java.awt.image.renderable.ParameterBlock |
_d<._E, _a<.java.util.Vector$ListItr |
_d<.java.awt.Component, _a<.javax.swing.JTabbedPane |
_d<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509SKI, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_d<.javax.swing.GroupLayout$ComponentInfo, _a<.javax.swing.GroupLayout$LinkInfo |
_d<._E, _a<.sun.nio.ch.Util$2 |
_d<._E, _a<.java.util.Vector |
_d<.java.lang.Object, _a<.javax.naming.directory.Attribute |
_d<.com.sun.org.apache.xerces.internal.xs.XSObject, _a<.com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl$XSObjectListIterator |
_d<.sun.net.httpserver.HttpContextImpl, _a<.sun.net.httpserver.ContextList |
_d<.java.lang.Object, _a<.sun.tools.jar.Main$1 |
_d<.com.sun.org.apache.xml.internal.security.keys.content.keyvalues.RSAKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<._E, _a<.java.util.concurrent.CopyOnWriteArraySet |
_d<.com.sun.org.apache.xml.internal.security.keys.content.KeyInfoReference, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<._E, _a<.java.util.JumboEnumSet |
_d<._V, _a<.java.util.concurrent.ConcurrentHashMap$ValuesView |
_d<.javax.xml.stream.XMLEventReader, _a<.javax.xml.stream.XMLEventWriter |
_d<._E, _a<.java.util.AbstractList$ListItr |
_d<.javax.swing.Action, _a<.javax.swing.JToolBar |
_d<.java.lang.String, _a<.javax.naming.ldap.LdapName |
_d<.java.security.Permission, _a<.java.security.BasicPermissionCollection |
_d<.java.lang.Object, _a<.java.util.concurrent.DelayQueue |
_d<.jdk.internal.org.objectweb.asm.tree.InsnList, _a<.jdk.internal.org.objectweb.asm.tree.InsnList |
_d<._E, _a<.java.util.ArrayDeque |
_d<.javax.swing.AbstractButton, _a<.javax.swing.ButtonGroup |
_d<.java.math.BigInteger, _a<.java.math.BigInteger |
_d<.java.lang.String, _a<.javax.naming.NameImpl |
_d<.java.lang.Object, _a<.java.util.Collections$CheckedMap$CheckedEntrySet |
_d<._E, _a<.java.util.HashSet |
_d<.sun.security.provider.PolicyParser$GrantEntry, _a<.sun.security.provider.PolicyParser |
_d<._E, _a<.java.util.Set |
_d<._T, _a<.javax.security.auth.Subject$ClassSet |
_d<._E, _a<.java.util.Collections$SynchronizedCollection |
_d<.javax.xml.datatype.Duration, _a<.com.sun.org.apache.xerces.internal.jaxp.datatype.DurationImpl |
_d<.javax.xml.datatype.Duration, _a<.javax.xml.datatype.Duration |
_d<.java.lang.Object, _a<.jdk.internal.org.objectweb.asm.tree.MethodNode$1 |
_d<.java.lang.Object, _a<.java.beans.beancontext.BeanContextSupport |
_d<.java.math.BigDecimal, _a<.java.math.BigDecimal |
_d<.byte, _a<.java.awt.image.renderable.ParameterBlock |
_d<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWSubListIterator |
_d<._E, _a<.java.util.Collections$EmptyListIterator |
_d<.java.lang.Object, _a<.java.util.Hashtable$EntrySet |
_d<.java.security.Permission, _a<.java.io.FilePermissionCollection |
_d<._E, _a<.java.util.concurrent.CopyOnWriteArrayList$COWSubList |
_d<.java.lang.Object, _a<.com.sun.org.apache.xerces.internal.impl.xs.XSModelImpl$XSNamespaceItemListIterator |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.DocAttributeSet |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintJobAttributeSet |
_d<._E, _a<.java.util.ListIterator |
_d<._E, _a<.java.util.RegularEnumSet |
_d<.java.awt.geom.Area, _a<.java.awt.geom.Area |
_d<.javax.xml.stream.events.XMLEvent, _a<.javax.xml.stream.XMLEventWriter |
_d<._E, _a<.java.util.ArrayList$ListItr |
_d<.javax.sound.midi.MidiEvent, _a<.javax.sound.midi.Track |
_d<.double, _a<.java.util.concurrent.atomic.DoubleAdder |
_d<.java.awt.Rectangle, _a<.java.awt.Rectangle |
_d<.com.sun.org.apache.xml.internal.security.keys.content.MgmtData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.com.sun.org.apache.xml.internal.security.keys.content.RetrievalMethod, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.com.sun.org.apache.xml.internal.security.keys.content.KeyName, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.java.lang.String, _a<.java.awt.Choice |
_d<.javax.management.relation.RoleUnresolved, _a<.javax.management.relation.RoleUnresolvedList |
_d<.java.lang.String, _a<.com.sun.jndi.ldap.LdapName |
_d<.sun.net.www.MimeEntry, _a<.sun.net.www.MimeTable |
_d<._E, _a<.java.util.concurrent.BlockingQueue |
_d<.javax.swing.JMenu, _a<.javax.swing.JMenuBar |
_d<.sun.awt.X11.XAtom, _a<.sun.awt.X11.XAtomList |
_d<.java.security.Permission, _a<.java.security.Policy$UnsupportedEmptyCollection |
_d<._E, _a<.javax.imageio.spi.PartiallyOrderedSet |
_d<._T, _a<.com.sun.jmx.remote.internal.ArrayQueue |
_d<.long, _a<.sun.java2d.marlin.stats.StatLong |
_d<.com.sun.media.sound.ModelPerformer, _a<.com.sun.media.sound.SimpleInstrument |
_d<.java.awt.Component, _a<.sun.awt.X11.InfoWindow |
_d<.java.lang.Object, _a<.java.awt.image.renderable.ParameterBlock |
_d<._E, _a<.java.util.Collections$UnmodifiableList$1 |
_d<.long, _a<.sun.java2d.marlin.stats.Histogram |
_d<.javax.xml.datatype.Duration, _a<.com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl |
_d<.java.awt.MenuItem, _a<.java.awt.Menu |
_d<.java.security.Permission, _a<.javax.management.MBeanServerPermissionCollection |
_d<._E, _a<.java.util.List |
_d<.javax.swing.tree.MutableTreeNode, _a<.javax.swing.tree.DefaultMutableTreeNode |
_d<._E, _a<.javax.security.auth.Subject$SecureSet |
_d<._E, _a<.java.util.concurrent.ConcurrentLinkedDeque |
_d<.java.security.cert.X509Certificate, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_d<.sun.security.util.math.IntegerModuloP, _a<.sun.security.util.math.intpoly.IntegerPolynomial$Element |
_d<.java.lang.Object, _a<.javax.naming.directory.BasicAttribute |
_d<.java.security.KeyStore, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_d<.com.sun.media.sound.ModelInstrument, _a<.com.sun.media.sound.SimpleInstrument |
_d<.java.awt.geom.Rectangle2D, _a<.java.awt.geom.Rectangle2D |
_d<._E, _a<.java.util.concurrent.ConcurrentSkipListSet |
_d<.javax.naming.RefAddr, _a<.javax.naming.Reference |
_d<.java.awt.Point, _a<.java.awt.Rectangle |
_d<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolverSpi, _a<.com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver |
_d<.com.sun.org.apache.xml.internal.security.keys.content.PGPData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.int, _a<.java.awt.image.renderable.ParameterBlock |
_d<._E, _a<.java.util.concurrent.DelayQueue |
_d<._E, _a<.java.util.concurrent.PriorityBlockingQueue |
_d<.java.security.Permission, _a<.java.security.PermissionCollection |
_d<._T_array, _a<.sun.swing.AccumulativeRunnable |
_d<.java.lang.String, _a<.javax.swing.JPopupMenu |
_d<.java.awt.TrayIcon, _a<.java.awt.SystemTray |
_d<.javax.swing.JMenuItem, _a<.javax.swing.JMenu |
_d<.long, _a<.sun.java2d.xr.XcbRequestCounter |
_d<.java.lang.String, _a<.javax.naming.Name |
_d<._E, _a<.java.util.Collections$AsLIFOQueue |
_d<._E, _a<.java.util.ArrayList$SubList$1 |
_d<.java.security.Permission, _a<.java.security.AllPermissionCollection |
_d<.com.sun.org.apache.xml.internal.security.keys.content.keyvalues.DSAKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.jdk.internal.org.objectweb.asm.tree.AbstractInsnNode, _a<.jdk.internal.org.objectweb.asm.tree.InsnList |
_d<.long, _a<.java.util.stream.LongStream$Builder |
_d<._K, _a<.java.util.concurrent.ConcurrentHashMap$KeySetView |
_d<.java.security.Permission, _a<.java.net.SocketPermissionCollection |
_d<.com.sun.org.apache.xml.internal.security.keys.content.SPKIData, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.javax.print.attribute.standard.JobStateReason, _a<.javax.print.attribute.standard.JobStateReasons |
_d<._E, _a<.java.util.concurrent.ArrayBlockingQueue |
_d<.javax.swing.Action, _a<.javax.swing.JPopupMenu |
_d<.com.sun.org.apache.xml.internal.security.keys.content.X509Data, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.java.awt.PopupMenu, _a<.java.awt.Component |
_d<.java.lang.Object, _a<.com.sun.jndi.ldap.LdapAttribute |
_d<._E, _a<.java.util.LinkedList$ListItr |
_d<.sun.security.util.math.IntegerModuloP, _a<.sun.security.util.math.IntegerModuloP |
_d<._E, _a<.sun.awt.util.IdentityArrayList |
_d<.java.security.Permission, _a<.javax.security.auth.kerberos.KrbDelegationPermissionCollection |
_d<.java.lang.String, _a<.java.awt.Menu |
_d<.java.lang.Object, _a<.javax.management.relation.RoleUnresolvedList |
_d<.short, _a<.java.awt.image.renderable.ParameterBlock |
_d<.float, _a<.java.awt.image.renderable.ParameterBlock |
_d<._E, _a<.java.util.concurrent.CopyOnWriteArrayList |
_d<.java.lang.Object, _a<.javax.print.attribute.standard.JobStateReasons |
_d<.javax.xml.stream.XMLEventReader, _a<.com.sun.xml.internal.stream.writers.XMLEventWriterImpl |
_d<.com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509IssuerSerial, _a<.com.sun.org.apache.xml.internal.security.keys.content.X509Data |
_d<._E, _a<.java.util.Queue |
_d<.javax.print.attribute.Attribute, _a<.javax.print.attribute.PrintRequestAttributeSet |
_d<.int, _a<.sun.java2d.marlin.stats.StatLong |
_d<.com.sun.org.apache.xml.internal.security.keys.content.DEREncodedKeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.com.sun.org.apache.xml.internal.security.keys.content.KeyValue, _a<.com.sun.org.apache.xml.internal.security.keys.KeyInfo |
_d<.java.lang.Object, _a<.javax.management.AttributeList |
_d<.sun.security.x509.GeneralSubtree, _a<.sun.security.x509.GeneralSubtrees }
-97
View File
@@ -1,97 +0,0 @@
import de.dhbwstuttgart.input.ConstraintParser;
import de.dhbwstuttgart.sat.asp.ASPGenerator;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* The facts behind {@code src/main/asp/cycleCheck.lp}. A constraint set that forces a placeholder
* to equal a type properly containing itself has no finite solution, and clingo's grounder
* diverges on it rather than reporting UNSAT (see ../../ASP_BUGS.md, Bug 5). The check runs before
* the solve, on placeholder identities alone, so it costs nothing however deep the types are.
*
* <p>What matters here is the containment/flow distinction: only a containment edge can put a
* placeholder inside its own type, so only a cycle through one of those is fatal.
*/
public class CycleCheckTest {
private static String facts(String cons) {
return ASPGenerator.generateCycleCheckFacts(ConstraintParser.parse(cons));
}
// "_r <. C1<_p1>" - solving _r means solving _p1 inside it.
@Test
public void aPlaceholderBoundedByAParameterizedTypeYieldsAContainsEdge() {
String f = facts("_r <. C1<_p1>,");
assertTrue(f, f.contains("containsEdge(0,0,\"_r\",\"_p1\")"));
assertTrue("no flow edge expected: " + f, !f.contains("flowEdge"));
}
// "_p <. _res" between two placeholders is a plain flow: harmless on its own, and harmless
// even in a cycle, because it never nests one type inside another.
@Test
public void aPlaceholderToPlaceholderConstraintYieldsAFlowEdge() {
String f = facts("_p <. _res,");
assertTrue(f, f.contains("flowEdge(0,0,\"_p\",\"_res\")"));
assertTrue("no contains edge expected: " + f, !f.contains("containsEdge"));
}
// Equality is symmetric, so it constrains in both directions.
@Test
public void equalityBetweenPlaceholdersYieldsBothFlowDirections() {
String f = facts("_a =. _b,");
assertTrue(f, f.contains("flowEdge(0,0,\"_a\",\"_b\")"));
assertTrue(f, f.contains("flowEdge(0,0,\"_b\",\"_a\")"));
}
// "C<_q> =. _p" says _p IS that type, so it must contain _q.
@Test
public void equalityWithAParameterizedTypeOnTheLeftStillYieldsAContainsEdge() {
String f = facts("C1<_q> =. _p,");
assertTrue(f, f.contains("containsEdge(0,0,\"_p\",\"_q\")"));
}
// ...but "C<_q> <. _p" does not: being a supertype of C<_q> does not oblige _p to contain _q.
// Deliberately conservative - a missing edge only costs detection, an invented one would
// reject a satisfiable constraint set.
@Test
public void aParameterizedLowerBoundYieldsNoContainsEdge() {
String f = facts("C1<_q> <. _p,");
assertTrue("expected no containment obligation: " + f, !f.contains("containsEdge"));
}
@Test
public void nestedTypeArgumentsAreReachedAtEveryDepth() {
String f = facts("_r <. C1<C2<_deep>>,");
assertTrue(f, f.contains("containsEdge(0,0,\"_r\",\"_deep\")"));
}
// Every alternative of an or-constraint is indexed separately, so the solver-side check can
// pick alternatives independently - which is the whole point, since a cycle usually needs a
// particular combination of them.
@Test
public void eachOrConstraintAlternativeIsIndexedSeparately() {
String f = facts("{ _r <. C1<_p1>, _p1 <. _res | _r <. C2<_p2>, _p2 <. _res }");
assertTrue(f, f.contains("alt(0,0)"));
assertTrue(f, f.contains("alt(0,1)"));
assertTrue(f, f.contains("containsEdge(0,0,\"_r\",\"_p1\")"));
assertTrue(f, f.contains("containsEdge(0,1,\"_r\",\"_p2\")"));
}
// A constraint outside any or-constraint becomes an or-constraint with one alternative, so
// its edges are always chosen - no special case needed in the .lp.
@Test
public void mandatoryConstraintsBecomeASingleAlternativeOrConstraint() {
String f = facts("_res <. _r,\n{ _r <. C1<_p1> | _r <. C2<_p1> }");
long alts = f.lines().filter(l -> l.startsWith("alt(0,")).count();
assertEquals("the mandatory conjunction should be one alternative: " + f, 1, alts);
}
@Test
public void groundConstraintsContributeNoEdgesAtAll() {
String f = facts("java.lang.Integer <. java.lang.Number,");
assertTrue("ground constraint should add no edges: " + f,
!f.contains("containsEdge") && !f.contains("flowEdge"));
}
}
-101
View File
@@ -1,101 +0,0 @@
import de.dhbwstuttgart.Main;
import org.junit.Test;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class MainTest {
@Test
public void genFactsWritesAspFacts() throws IOException {
Path cons = Files.createTempFile("constraints", ".cons");
Path facts = Files.createTempFile("facts", ".lp");
try {
Files.writeString(cons, "_Foo_3 <. java.lang.Number,\n");
Main.main(new String[]{"gen-facts", cons.toString(), facts.toString()});
String written = Files.readString(facts);
assertTrue(written.contains("orCons("));
assertTrue(written.contains("subcons(tph(\"_Foo_3\")"));
assertTrue(written.contains("type(\"java.lang.Number\",null)"));
} finally {
Files.deleteIfExists(cons);
Files.deleteIfExists(facts);
}
}
@Test
public void genFactsAlsoIncludesExtendsRelations() throws IOException {
// "Matrix < java.util.Vector" is exactly the extendsRelation text JavaConstraintGenerator
// now emits (see JavaProjectExtractor#getExtendsRelations), mixed into the same .cons
// file as ordinary constraints.
Path cons = Files.createTempFile("constraints", ".cons");
Path facts = Files.createTempFile("facts", ".lp");
try {
Files.writeString(cons, "Matrix < java.util.Vector\n_Foo_3 <. java.lang.Number,\n");
Main.main(new String[]{"gen-facts", cons.toString(), facts.toString()});
String written = Files.readString(facts);
assertTrue(written.contains("orCons("));
// A guarded rule, not a bare fact. Head and body are different predicates -
// subtype/2 vs. subtype/1, the latter derived by unifyDiss.lp from subcons - so the
// rule is not self-referential. The body is what binds the type parameters of a
// generic extends relation, which is what keeps the rule safe for clingo.
assertTrue("actual: " + written, written.contains(
"subtype(type(\"Matrix\",null),type(\"java.util.Vector\",null))"
+ ":-subtype(type(\"Matrix\",null))."));
} finally {
Files.deleteIfExists(cons);
Files.deleteIfExists(facts);
}
}
@Test
public void parseSolutionWritesJsonWithLeadingUnderscoreRestored() throws IOException {
Path atoms = Files.createTempFile("atoms", ".txt");
Path solution = Files.createTempFile("solution", ".json");
try {
Files.writeString(atoms, "sigma(tph(\"_Foo_3\"),type(\"java.lang.Integer\",null))");
Main.main(new String[]{"parse-solution", atoms.toString(), solution.toString()});
String json = Files.readString(solution);
assertTrue(json.contains("\"_Foo_3\""));
assertTrue(json.contains("\"java.lang.Integer\""));
} finally {
Files.deleteIfExists(atoms);
Files.deleteIfExists(solution);
}
}
@Test
public void genFactsHandlesAnEmptyConstraintFileWithoutCrashing() throws IOException {
// Both ANTLR grammars require at least one entry, so a blank .cons file - e.g. from a
// Java file with no constraint-generating constructs yet supported - must not crash.
Path cons = Files.createTempFile("constraints", ".cons");
Path facts = Files.createTempFile("facts", ".lp");
try {
Files.writeString(cons, "");
Main.main(new String[]{"gen-facts", cons.toString(), facts.toString()});
assertEquals("", Files.readString(facts));
} finally {
Files.deleteIfExists(cons);
Files.deleteIfExists(facts);
}
}
@Test
public void parseSolutionHandlesEmptyAtomsWithoutCrashing() throws IOException {
Path atoms = Files.createTempFile("atoms", ".txt");
Path solution = Files.createTempFile("solution", ".json");
try {
Files.writeString(atoms, "");
Main.main(new String[]{"parse-solution", atoms.toString(), solution.toString()});
assertEquals("{\n}\n", Files.readString(solution));
} finally {
Files.deleteIfExists(atoms);
Files.deleteIfExists(solution);
}
}
}
-44
View File
@@ -1,44 +0,0 @@
import de.dhbwstuttgart.output.SolutionParser;
import org.junit.Test;
import java.util.Map;
import static org.junit.Assert.assertEquals;
public class SolutionParserTest {
@Test
public void parsePlaceholderNameWithInternalUnderscore(){
// JavaConstraintGenerator always names placeholders "_<basename>_<counter>", e.g.
// "_Foo_3" - the tph rule's IDENTIFIER token must accept the internal underscore.
String solution = "sigma(tph(\"_Foo_3\"),type(\"java.lang.Integer\",null))";
Map<String,String> sigmas = SolutionParser.parse(solution);
assertEquals("java.lang.Integer", sigmas.get("Foo_3"));
}
@Test
public void parseMatrixSolution(){
String solution = "sigma(tph(\"_AMY\"),type(\"java.lang.Integer\",null)) sigma(tph(\"_AK\"),type(\"java.lang.Number\",null)) sigma(tph(\"_AY\"),type(\"java.lang.Number\",null)) sigma(tph(\"_J\"),type(\"java.lang.Number\",null)) sigma(tph(\"_V\"),type(\"java.lang.Integer\",null)) sigma(tph(\"_G\"),type(\"java.lang.Integer\",null)) sigma(tph(\"_BK\"),type(\"java.lang.Integer\",null)) sigma(tph(\"_BA\"),type(\"java.lang.Integer\",null)) sigma(tph(\"_U\"),type(\"java.lang.Integer\",null)) sigma(tph(\"_BU\"),type(\"java.lang.Integer\",null)) sigma(tph(\"_BO\"),type(\"java.lang.Integer\",null)) sigma(tph(\"_BG\"),type(\"java.lang.Number\",null)) sigma(tph(\"_BB\"),type(\"java.lang.Integer\",null)) sigma(tph(\"_BV\"),type(\"java.lang.Integer\",null)) sigma(tph(\"_AU\"),type(\"java.lang.Integer\",null)) sigma(tph(\"_AF\"),type(\"java.lang.Integer\",null)) sigma(tph(\"_BC\"),type(\"java.lang.Integer\",null)) sigma(tph(\"_AS\"),type(\"java.util.Vector\",params(type(\"java.lang.Integer\",null)))) sigma(tph(\"_BD\"),type(\"java.lang.Integer\",null)) sigma(tph(\"_AG\"),type(\"java.lang.Integer\",null)) sigma(tph(\"_AV\"),type(\"java.lang.Integer\",null)) sigma(tph(\"_ANN\"),type(\"java.lang.Integer\",null)) sigma(tph(\"_ANH\"),type(\"java.lang.Integer\",null)) sigma(tph(\"_AD\"),type(\"Matrix\",null)) sigma(tph(\"_AP\"),type(\"java.util.Vector\",params(type(\"java.lang.Integer\",null)))) sigma(tph(\"_R\"),type(\"java.lang.Boolean\",null)) sigma(tph(\"_BR\"),type(\"Object\",null)) sigma(tph(\"_ANO\"),type(\"java.lang.Integer\",null)) sigma(tph(\"_AB\"),type(\"Matrix\",null)) sigma(tph(\"_AM\"),type(\"java.util.Vector\",params(type(\"java.lang.Integer\",null))))\n";
Map<String,String> sigmas = SolutionParser.parse(solution);
for(var key : sigmas.keySet()){
System.out.println(key + " -> " + sigmas.get(key));
}
}
@Test
public void parseOneSigma(){
String solution = "sigma(tph(\"_AMY\"),type(\"java.lang.Integer\",null))";
System.out.println(solution);
Map<String,String> sigmas = SolutionParser.parse(solution);
for(var key : sigmas.keySet()){
System.out.println(key + " -> " + sigmas.get(key));
}
}
@Test
public void parseSolution(){
String solution ="sigma(tph(\"_O\"),type(\"C1\",null)) sigma(tph(\"_W\"),type(\"C2\",null)) sigma(tph(\"_AM\"),type(\"C1\",null)) sigma(tph(\"_BA\"),type(\"C1\",null)) sigma(tph(\"_AW\"),type(\"C1\",null)) sigma(tph(\"_AO\"),type(\"C1\",null)) sigma(tph(\"_AK\"),type(\"C1\",null)) sigma(tph(\"_AI\"),type(\"C1\",null)) sigma(tph(\"_AQ\"),type(\"C1\",null)) sigma(tph(\"_AY\"),type(\"C1\",null)) sigma(tph(\"_AE\"),type(\"C1\",null)) sigma(tph(\"_BC\"),type(\"C1\",null)) sigma(tph(\"_AU\"),type(\"C1\",null)) sigma(tph(\"_AS\"),type(\"C1\",null)) sigma(tph(\"_V\"),type(\"java.lang.Object\",null)) sigma(tph(\"_N\"),type(\"C1\",null)) sigma(tph(\"_AG\"),type(\"C1\",null)) sigma(tph(\"_AD\"),type(\"C1\",null))\n";
Map<String,String> sigmas = SolutionParser.parse(solution);
for(var key : sigmas.keySet()){
System.out.println(key + " -> " + sigmas.get(key));
}
}
}
+26 -897
View File
@@ -1,12 +1,14 @@
import de.dhbwstuttgart.input.ConstraintParser;
import de.dhbwstuttgart.sat.asp.*;
import de.dhbwstuttgart.typeinference.constraints.Constraint;
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
import de.dhbwstuttgart.typeinference.constraints.Pair;
import de.dhbwstuttgart.typeinference.unify.TypeUnify;
import de.dhbwstuttgart.typeinference.unify.UnifyResultModel;
import de.dhbwstuttgart.typeinference.unify.UnifyTaskModel;
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
import de.dhbwstuttgart.typeinference.unify.model.*;
import org.apache.commons.io.output.NullWriter;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashSet;
@@ -16,885 +18,7 @@ import java.util.Set;
public class UnifyTest {
public static final String rootDirectory = System.getProperty("user.dir")+"/resources/javFiles/";
@Test
public void generateConstraintSet(){
System.out.println(ASPGenerator.generateOrCons(generateOrConstraintTwoSolutions("test")));
}
@Test
public void parserTest(){
String input = "Boolean =. g," +
"t =. bc," +
"f <. e," +
"e =. bj," +
"Vector<Integer> <. r," +
"p <. l," +
"e <. Number,";
System.out.println(ASPGenerator.generateASP(ConstraintParser.parse(input)));
}
@Test
public void manyOrConstraints() throws IOException {
File resourcesDirectory = new File("src/test/data");
var consFile = Files.readString(new File(resourcesDirectory, "OrTestAllClassesWithAddMethod.cons").toPath());
System.out.println(ASPGenerator.generateASP(ConstraintParser.parse(consFile)));
}
@Test
public void sixOrConstraints() throws IOException {
File resourcesDirectory = new File("src/test/data");
var consFile = Files.readString(new File(resourcesDirectory, "OrTestAllClassesWith6AddMethods.cons").toPath());
System.out.println(ASPGenerator.generateASP(ConstraintParser.parse(consFile)));
}
@Test
public void manyOrConstraints2() throws IOException {
File resourcesDirectory = new File("src/test/data");
var consFile = Files.readString(new File(resourcesDirectory, "OrTestAllClassesWithAddMethod2.cons").toPath());
System.out.println(ASPGenerator.generateASP(ConstraintParser.parse(consFile)));
}
@Test
public void manyOrConstraintsConsecutiveCalls() throws IOException {
File resourcesDirectory = new File("src/test/data");
var consFile = Files.readString(new File(resourcesDirectory, "OrTestAllClassesWith3AddMethodsABCDCalls.cons").toPath());
System.out.println(ASPGenerator.generateASP(ConstraintParser.parse(consFile)));
}
@Test
public void extendsRelationParserTest(){
String input = "Matrix < Vector<Vector<Integer>>," +
"Vector<X> < List<X>," +
"MyPair<X,Y> < Pair<X,X>," +
"Pair<X,Y> < Object," +
"List<X> < Object";
System.out.println(ASPGenerator.generateExtendsRelations(ConstraintParser.parseExtendsRelations(input)));
//TODO: Finish Extends Relation parser
}
@Test
public void paperExample(){
String input = "Matrix < Vector<Vector<Integer>>," +
"Vector<X> < List<X>," +
"MyPair<X,Y> < Pair<X,X>," +
"Pair<X,Y> < Object," +
"List<X> < Object";
//System.out.println(ASPGenerator.generateExtendsRelations(ConstraintParser.parseExtendsRelations(input)));
String cons = "{List<Integer> <. _a | List<String> <. _a},\n List<_c> <. _b,\n _m <. _b,\n _m <. Matrix";
System.out.println(ASPGenerator.generateASP(ConstraintParser.parse(cons)));
}
/*
@Test
public void orConsTest() throws IOException {
String input =
"java.lang.Boolean < java.lang.Object," +
"java.lang.String < java.lang.Object," +
"java.lang.Integer < java.lang.Object," +
"OrConsTest < java.lang.Object," +
"MyPair<X,Y> < Pair<X,X>," +
"Pair<X,Y> < Object," +
"List<X> < Object," +
"Integer < Object, String < Object, " +
Files.readString(Paths.get("/","tmp","output"));
System.out.println(ASPGenerator.generateASP(ConstraintParser.parse(input)));
System.out.println(ASPGenerator.generateExtendsRelations(ConstraintParser.parseExtendsRelations(input)));
}
*/
@Test
public void alotOfOrConstraintsTest(){
String input =
"Vector<X> < List<X>," +
"MyPair<X,Y> < Pair<X,X>," +
"Pair<X,Y> < Object," +
"List<X> < Object," +
"Integer < Object, String < Object, " +
"{List<Integer> <. _a | List<String> <. _a}{List<_c> <. _b, String <. Object | List<_c> <. _b} {Vector<Integer> <. _b | Vector<String> <. _b}"+
"{List<Integer> <. _aa | List<String> <. _aa}{List<_c> <. _ba | List<_c> <. _ba} {Vector<Integer> <. _ba | Vector<String> <. _ba}"+
"{List<Integer> <. _aaa | List<String> <. _aaa}{List<_c> <. _baa | List<_c> <. _baa} {Vector<Integer> <. _baa | Vector<String> <. _baa}";
System.out.println(ASPGenerator.generateASP(ConstraintParser.parse(input)));
System.out.println(ASPGenerator.generateExtendsRelations(ConstraintParser.parseExtendsRelations(input)));
}
@Test
public void matrix(){
String input = "java.lang.Boolean < Object," +
"java.lang.Integer < java.lang.Number," +
"java.lang.Number < Object," + //TODO: Implement smaller
"java.util.Vector<X> < Object," +
"Matrix < java.util.Vector<java.util.Vector<java.lang.Integer>>\n" +
"_BE=.java.lang.Boolean\n" +
"java.util.Vector<java.util.Vector<java.lang.Integer>>=.java.util.Vector<_ANR>\n" +
"_AU<.java.lang.Number\n" +
"java.util.Vector<java.lang.Integer><._AS\n" +
"_AI=.Matrix\n" +
"_AF=._CK\n" +
"_AP<._AM\n" +
"_BC<.java.lang.Number\n" +
"java.util.Vector<java.util.Vector<java.lang.Integer>>=.java.util.Vector<_ANQ>\n" +
"_S=.Matrix\n" +
"_BD<._BC\n" +
"_AV<._AU\n" +
"_AU<.java.lang.Number\n" +
"_BV<._BA\n" +
"Matrix<._AD\n" +
"_J<.java.lang.Number\n" +
"java.lang.Boolean=._AH\n" +
"_V<.java.lang.Integer\n" +
"_AY<.java.lang.Number\n" +
"_BC=._BW\n" +
"_AK<.java.lang.Number\n" +
"_AH=.java.lang.Boolean\n" +
"_BC<.java.lang.Number\n" +
"_AQ=.Matrix\n" +
"_G<.java.lang.Integer\n" +
"java.lang.Integer<.java.lang.Number\n" +
"_AF<.java.lang.Number\n" +
"_AW=.java.lang.Boolean\n" +
"_BB<._BA\n" +
"java.lang.Boolean=._AW\n" +
"java.lang.Boolean=._H\n" +
"_H=.java.lang.Boolean\n" +
"_AD<._AB\n" +
"_AF<.java.lang.Number\n" +
"_BG<.java.lang.Number\n" +
"java.lang.Boolean=._BE\n" +
"_AU=._CD\n" +
"_AG<._AF\n" +
"{\n" +
"{\n" +
"Matrix<.Matrix\n" +
"_AE=.Matrix\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_AG=.java.lang.Integer\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_AI=.java.util.AbstractList<_AMV>\n" +
"java.lang.Integer<._AK\n" +
"}\n" +
"|{\n" +
"_AI=.Matrix\n" +
"java.lang.Integer<._AK\n" +
"}\n" +
"|{\n" +
"java.lang.Integer<._AK\n" +
"_AI=.java.util.List<_AMU>\n" +
"}\n" +
"|{\n" +
"_AI=.java.util.AbstractList<_AMV>\n" +
"java.lang.Integer<._AK\n" +
"}\n" +
"|{\n" +
"_AI=.java.util.Vector<_AMW>\n" +
"java.lang.Integer<._AK\n" +
"}\n" +
"|{\n" +
"_AI=.java.util.List<_AMU>\n" +
"java.lang.Integer<._AK\n" +
"}\n" +
"|{\n" +
"java.lang.Integer<._AK\n" +
"_AI=.java.util.Vector<_AMW>\n" +
"}\n" +
"|{\n" +
"_AI=.Matrix\n" +
"java.lang.Integer<._AK\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_AF<.java.lang.Integer\n" +
"_AQ=.java.util.Vector<_AMX>\n" +
"_AMX<._AP\n" +
"}\n" +
"|{\n" +
"_AF<.java.lang.Integer\n" +
"java.util.Vector<java.lang.Integer><._AP\n" +
"_AQ=.Matrix\n" +
"}\n" +
"|{\n" +
"_AF<.java.lang.Integer\n" +
"_AQ=.java.util.Vector<_AMX>\n" +
"_AMX<._AP\n" +
"}\n" +
"|{\n" +
"java.util.Vector<java.lang.Integer><._AP\n" +
"_AF<.java.lang.Integer\n" +
"_AQ=.Matrix\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_AT=.java.util.Vector<GE>\n" +
"java.util.Vector<_AMY><.java.util.Vector<java.lang.Integer>\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_AV=.java.lang.Integer\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_AM=.Matrix\n" +
"java.lang.Integer<._AY\n" +
"}\n" +
"|{\n" +
"java.lang.Integer<._AY\n" +
"_AM=.java.util.List<_AMZ>\n" +
"}\n" +
"|{\n" +
"java.lang.Integer<._AY\n" +
"_AM=.java.util.Vector<_ANB>\n" +
"}\n" +
"|{\n" +
"_AM=.java.util.List<_AMZ>\n" +
"java.lang.Integer<._AY\n" +
"}\n" +
"|{\n" +
"java.lang.Integer<._AY\n" +
"_AM=.java.util.AbstractList<_ANA>\n" +
"}\n" +
"|{\n" +
"_AM=.java.util.AbstractList<_ANA>\n" +
"java.lang.Integer<._AY\n" +
"}\n" +
"|{\n" +
"java.lang.Integer<._AY\n" +
"_AM=.Matrix\n" +
"}\n" +
"|{\n" +
"_AM=.java.util.Vector<_ANB>\n" +
"java.lang.Integer<._AY\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_BB=.java.lang.Integer\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_BD=.java.lang.Integer\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_AM=.java.util.Vector<_ANE>\n" +
"java.lang.Integer<._BG\n" +
"}\n" +
"|{\n" +
"_AM=.Matrix\n" +
"java.lang.Integer<._BG\n" +
"}\n" +
"|{\n" +
"_AM=.java.util.Vector<_ANE>\n" +
"java.lang.Integer<._BG\n" +
"}\n" +
"|{\n" +
"_AM=.java.util.AbstractList<_AND>\n" +
"java.lang.Integer<._BG\n" +
"}\n" +
"|{\n" +
"_AM=.Matrix\n" +
"java.lang.Integer<._BG\n" +
"}\n" +
"|{\n" +
"_AM=.java.util.List<_ANC>\n" +
"java.lang.Integer<._BG\n" +
"}\n" +
"|{\n" +
"_AM=.java.util.List<_ANC>\n" +
"java.lang.Integer<._BG\n" +
"}\n" +
"|{\n" +
"_AM=.java.util.AbstractList<_AND>\n" +
"java.lang.Integer<._BG\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_AM=.Matrix\n" +
"_BC<.java.lang.Integer\n" +
"java.util.Vector<java.lang.Integer><._BK\n" +
"}\n" +
"|{\n" +
"_AM=.Matrix\n" +
"java.util.Vector<java.lang.Integer><._BK\n" +
"_BC<.java.lang.Integer\n" +
"}\n" +
"|{\n" +
"_ANG<._BK\n" +
"_AM=.java.util.AbstractList<_ANG>\n" +
"_BC<.java.lang.Integer\n" +
"}\n" +
"|{\n" +
"_AM=.java.util.Vector<_ANH>\n" +
"_BC<.java.lang.Integer\n" +
"_ANH<._BK\n" +
"}\n" +
"|{\n" +
"_AM=.java.util.AbstractList<_ANG>\n" +
"_ANG<._BK\n" +
"_BC<.java.lang.Integer\n" +
"}\n" +
"|{\n" +
"_AM=.java.util.List<_ANF>\n" +
"_ANF<._BK\n" +
"_BC<.java.lang.Integer\n" +
"}\n" +
"|{\n" +
"_AM=.java.util.List<_ANF>\n" +
"_ANF<._BK\n" +
"_BC<.java.lang.Integer\n" +
"}\n" +
"|{\n" +
"_ANH<._BK\n" +
"_BC<.java.lang.Integer\n" +
"_AM=.java.util.Vector<_ANH>\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_ANI<._BR\n" +
"_AC=.java.util.List<_ANI>\n" +
"_BC<.java.lang.Integer\n" +
"}\n" +
"|{\n" +
"_AC=.Matrix\n" +
"java.util.Vector<java.lang.Integer><._BR\n" +
"_BC<.java.lang.Integer\n" +
"}\n" +
"|{\n" +
"_AC=.Matrix\n" +
"_BC<.java.lang.Integer\n" +
"java.util.Vector<java.lang.Integer><._BR\n" +
"}\n" +
"|{\n" +
"_ANJ<._BR\n" +
"_AC=.java.util.AbstractList<_ANJ>\n" +
"_BC<.java.lang.Integer\n" +
"}\n" +
"|{\n" +
"_BC<.java.lang.Integer\n" +
"_AC=.java.util.Vector<_ANK>\n" +
"_ANK<._BR\n" +
"}\n" +
"|{\n" +
"_AC=.java.util.Vector<_ANK>\n" +
"_BC<.java.lang.Integer\n" +
"_ANK<._BR\n" +
"}\n" +
"|{\n" +
"_BC<.java.lang.Integer\n" +
"_AC=.java.util.List<_ANI>\n" +
"_ANI<._BR\n" +
"}\n" +
"|{\n" +
"_AC=.java.util.AbstractList<_ANJ>\n" +
"_BC<.java.lang.Integer\n" +
"_ANJ<._BR\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_BR=.java.util.AbstractList<_ANM>\n" +
"_ANM<._BO\n" +
"_AU<.java.lang.Integer\n" +
"}\n" +
"|{\n" +
"java.util.Vector<java.lang.Integer><._BO\n" +
"_AU<.java.lang.Integer\n" +
"_BR=.Matrix\n" +
"}\n" +
"|{\n" +
"_AU<.java.lang.Integer\n" +
"_ANL<._BO\n" +
"_BR=.java.util.List<_ANL>\n" +
"}\n" +
"|{\n" +
"_AU<.java.lang.Integer\n" +
"_BR=.java.util.List<_ANL>\n" +
"_ANL<._BO\n" +
"}\n" +
"|{\n" +
"_ANN<._BO\n" +
"_BR=.java.util.Vector<_ANN>\n" +
"_AU<.java.lang.Integer\n" +
"}\n" +
"|{\n" +
"_ANM<._BO\n" +
"_AU<.java.lang.Integer\n" +
"_BR=.java.util.AbstractList<_ANM>\n" +
"}\n" +
"|{\n" +
"_ANN<._BO\n" +
"_BR=.java.util.Vector<_ANN>\n" +
"_AU<.java.lang.Integer\n" +
"}\n" +
"|{\n" +
"_BR=.Matrix\n" +
"java.util.Vector<java.lang.Integer><._BO\n" +
"_AU<.java.lang.Integer\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_BK<.java.lang.Integer\n" +
"java.lang.Integer=._BU\n" +
"_BO<.java.lang.Integer\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_BU<.java.lang.Integer\n" +
"_BA<.java.lang.Integer\n" +
"java.lang.Integer=._BV\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_BA<.java.util.Vector<java.lang.Integer>\n" +
"_AS=.Matrix\n" +
"}\n" +
"|{\n" +
"_AS=.Matrix\n" +
"_BA<.java.util.Vector<java.lang.Integer>\n" +
"}\n" +
"|{\n" +
"_BA<._ANO\n" +
"_AS=.java.util.Vector<_ANO>\n" +
"}\n" +
"|{\n" +
"_BA<._ANO\n" +
"_AS=.java.util.Vector<_ANO>\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_AS<.java.util.Vector<java.lang.Integer>\n" +
"_AD=.Matrix\n" +
"}\n" +
"|{\n" +
"_AS<._ANP\n" +
"_AD=.java.util.Vector<_ANP>\n" +
"}\n" +
"|{\n" +
"_AS<.java.util.Vector<java.lang.Integer>\n" +
"_AD=.Matrix\n" +
"}\n" +
"|{\n" +
"_AS<._ANP\n" +
"_AD=.java.util.Vector<_ANP>\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_G=.java.lang.Integer\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_F=.java.util.List<_ANS>\n" +
"java.lang.Integer<._J\n" +
"}\n" +
"|{\n" +
"_F=.java.util.AbstractList<_ANT>\n" +
"java.lang.Integer<._J\n" +
"}\n" +
"|{\n" +
"_F=.java.util.Vector<_ANU>\n" +
"java.lang.Integer<._J\n" +
"}\n" +
"|{\n" +
"_F=.Matrix\n" +
"java.lang.Integer<._J\n" +
"}\n" +
"|{\n" +
"java.lang.Integer<._J\n" +
"_F=.Matrix\n" +
"}\n" +
"|{\n" +
"java.lang.Integer<._J\n" +
"_F=.java.util.List<_ANS>\n" +
"}\n" +
"|{\n" +
"java.lang.Integer<._J\n" +
"_F=.java.util.Vector<_ANU>\n" +
"}\n" +
"|{\n" +
"java.lang.Integer<._J\n" +
"_F=.java.util.AbstractList<_ANT>\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_F=.java.util.Vector<_ANV>\n" +
"java.lang.Integer<.java.lang.Integer\n" +
"_ANV<._N\n" +
"}\n" +
"|{\n" +
"_F=.Matrix\n" +
"java.lang.Integer<.java.lang.Integer\n" +
"java.util.Vector<java.lang.Integer><._N\n" +
"}\n" +
"|{\n" +
"_ANV<._N\n" +
"java.lang.Integer<.java.lang.Integer\n" +
"_F=.java.util.Vector<_ANV>\n" +
"}\n" +
"|{\n" +
"_F=.Matrix\n" +
"java.lang.Integer<.java.lang.Integer\n" +
"java.util.Vector<java.lang.Integer><._N\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_F=.Matrix\n" +
"java.util.Vector<java.lang.Integer><._N\n" +
"java.lang.Integer<.java.lang.Integer\n" +
"}\n" +
"|{\n" +
"_F=.java.util.Vector<_ANX>\n" +
"java.lang.Integer<.java.lang.Integer\n" +
"_ANX<._N\n" +
"}\n" +
"|{\n" +
"_F=.java.util.Vector<_ANX>\n" +
"java.lang.Integer<.java.lang.Integer\n" +
"_ANX<._N\n" +
"}\n" +
"|{\n" +
"java.util.Vector<java.lang.Integer><._N\n" +
"_F=.Matrix\n" +
"java.lang.Integer<.java.lang.Integer\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"java.util.Vector<java.lang.Integer><._N\n" +
"_F=.Matrix\n" +
"java.lang.Integer<.java.lang.Integer\n" +
"}\n" +
"|{\n" +
"java.util.Vector<java.lang.Integer><._N\n" +
"java.lang.Integer<.java.lang.Integer\n" +
"_F=.Matrix\n" +
"}\n" +
"|{\n" +
"_F=.java.util.Vector<_ANZ>\n" +
"_ANZ<._N\n" +
"java.lang.Integer<.java.lang.Integer\n" +
"}\n" +
"|{\n" +
"_F=.java.util.Vector<_ANZ>\n" +
"_ANZ<._N\n" +
"java.lang.Integer<.java.lang.Integer\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_F=.Matrix\n" +
"java.lang.Integer<.java.lang.Integer\n" +
"java.util.Vector<java.lang.Integer><._N\n" +
"}\n" +
"|{\n" +
"_AOB<._N\n" +
"java.lang.Integer<.java.lang.Integer\n" +
"_F=.java.util.Vector<_AOB>\n" +
"}\n" +
"|{\n" +
"_F=.java.util.Vector<_AOB>\n" +
"java.lang.Integer<.java.lang.Integer\n" +
"_AOB<._N\n" +
"}\n" +
"|{\n" +
"java.util.Vector<java.lang.Integer><._N\n" +
"java.lang.Integer<.java.lang.Integer\n" +
"_F=.Matrix\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_N<._AOA\n" +
"java.lang.Boolean<._R\n" +
"_S=.java.util.Vector<_AOA>\n" +
"}\n" +
"|{\n" +
"_N<._ANW\n" +
"java.lang.Boolean<._R\n" +
"_S=.java.util.List<_ANW>\n" +
"}\n" +
"|{\n" +
"_S=.java.util.List<_ANW>\n" +
"java.lang.Boolean<._R\n" +
"_N<._ANW\n" +
"}\n" +
"|{\n" +
"_N<._AOA\n" +
"java.lang.Boolean<._R\n" +
"_S=.java.util.Vector<_AOA>\n" +
"}\n" +
"|{\n" +
"_N<.java.util.Vector<java.lang.Integer>\n" +
"java.lang.Boolean<._R\n" +
"_S=.Matrix\n" +
"}\n" +
"|{\n" +
"java.lang.Boolean<._R\n" +
"_S=.Matrix\n" +
"_N<.java.util.Vector<java.lang.Integer>\n" +
"}\n" +
"|{\n" +
"java.lang.Boolean<._R\n" +
"_S=.java.util.AbstractList<_ANY>\n" +
"_N<._ANY\n" +
"}\n" +
"|{\n" +
"java.lang.Boolean<._R\n" +
"_S=.java.util.AbstractList<_ANY>\n" +
"_N<._ANY\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"_U=.java.lang.Integer\n" +
"}\n" +
"}\n" +
"{\n" +
"{\n" +
"java.lang.Integer<.java.lang.Integer\n" +
"java.lang.Integer=._V\n" +
"_U<.java.lang.Integer\n" +
"}\n" +
"}\n";
System.out.println(ASPGenerator.generateASP(ConstraintParser.parse(input)));
System.out.println(ASPGenerator.generateExtendsRelations(ConstraintParser.parseExtendsRelations(input)));
}
@Test
public void matrix2k(){
//und-constraints
//T =. BC
//java.lang.Boolean =. G
//G =. java.lang.Boolean
//F <. E
//E =. BJ
//Vector<java.lang.Integer> <. R
//P <. L
//E <!=. java.lang.Number
//C =. A
//M =. Matrix
//AC <. AB
//Matrix <. C
//AB =. AV
//X <!=. java.lang.Number
//java.lang.Boolean =. AD
//AU <. Z
//AD =. java.lang.Boolean
//H =. Matrix
//AA <. Z
//AB <!=. java.lang.Number
//V =. java.lang.Boolean
//java.lang.Boolean =. V
//J <!=. java.lang.Number
//oder-constraints
//set #1
//Matrix <. Matrix
//set #2
//F =. java.lang.Float
//F =. java.lang.Integer
//set #3
//H =. ? extends Matrix
//java.lang.Integer =. J
//H =. Vector<ALB>
//java.lang.Integer =. J
//H =. Matrix
//java.lang.Integer =. J
//H =. ? extends Vector<ALB>
//java.lang.Integer =. J
//set #4
//ALC =. P
//M =. Vector<ALC>
//E <. java.lang.Integer
//Vector<java.lang.Integer> =. P
//M =. ? extends Matrix
//E <. java.lang.Integer
//Vector<java.lang.Integer> =. P
//M =. Matrix
//E <. java.lang.Integer
//ALC =. P
//M =. ? extends Vector<ALC>
//E <. java.lang.Integer
//set #5
//Vector<ALD> <. Vector<java.lang.Integer>
//set #6
//U =. java.lang.Float
//U =. java.lang.Integer
//set #7
//L =. ? extends Matrix
//java.lang.Integer =. X
//L =. ? extends Vector<AMH>
//java.lang.Integer =. X
//L =. Matrix
//java.lang.Integer =. X
//L =. Vector<AMH>
//java.lang.Integer =. X
//set #8
//AA =. java.lang.Float
//AA =. java.lang.Integer
//set #9
//AC =. java.lang.Integer
//AC =. java.lang.Float
//set #10
//L =. ? extends Matrix
//java.lang.Integer =. AF
//L =. ? extends Vector<ANL>
//java.lang.Integer =. AF
//L =. Matrix
//java.lang.Integer =. AF
//L =. Vector<ANL>
//java.lang.Integer =. AF
//set #11
//Vector<java.lang.Integer> =. AJ
//L =. Matrix
//AB <. java.lang.Integer
//ANM =. AJ
//L =. ? extends Vector<ANM>
//AB <. java.lang.Integer
//Vector<java.lang.Integer> =. AJ
//L =. ? extends Matrix
//AB <. java.lang.Integer
//ANM =. AJ
//L =. Vector<ANM>
//AB <. java.lang.Integer
//set #12
//AB <. java.lang.Integer
//Vector<java.lang.Integer> =. AN
//B =. Matrix
//ANN =. AN
//AB <. java.lang.Integer
//B =. ? extends Vector<ANN>
//B =. Vector<ANN>
//ANN =. AN
//AB <. java.lang.Integer
//B =. ? extends Matrix
//AB <. java.lang.Integer
//Vector<java.lang.Integer> =. AN
//set #13
//Vector<java.lang.Integer> =. AR
//AN =. ? extends Matrix
//T <. java.lang.Integer
//AN =. ? extends Vector<ANO>
//ANO =. AR
//T <. java.lang.Integer
//AN =. Vector<ANO>
//ANO =. AR
//T <. java.lang.Integer
//AN =. Matrix
//Vector<java.lang.Integer> =. AR
//T <. java.lang.Integer
//set #14
//java.lang.Integer =. AT
//AJ <. java.lang.Integer
//AR <. java.lang.Integer
}
@Test
public void matrixTestBasic(){
/*
//und-constraints
//Matrix <. ret
//Integer <. i
//Matrix <. Vector<x?>
//x? <. v1
//i <. Integer
//Vector<Integer> <. v2
//v1 <. Vector<y?>
//m <. Vector<z?>
//z? <. zr
//zr <. Vector<z2?>
//z2? <. z2r
//z2r <. Integer
//v1 <. Vector<y2?>
//y2? <. y2r
//y2r <. Integer
*/
HashSet<Pair> cons = new HashSet<>();
//v2 <. x2r
cons.add(new LessDot(new TypePlaceholder("v2"), new TypePlaceholder("x2r")));
//x2? <. x2r
cons.add(new LessDot(new TypePlaceholder("x2"), new TypePlaceholder("x2r")));
//ret <. Vector<x2?>
cons.add(new LessDot(new TypePlaceholder("ret"), new NamedType("Vector", List.of(new TypePlaceholder("x2")))));
//v2 <. Vector<x3?>
cons.add(new LessDot(new TypePlaceholder("v2"), new NamedType("Vector", List.of(new TypePlaceholder("x3")))));
//x3? <. x3r
cons.add(new LessDot(new TypePlaceholder("x3"), new TypePlaceholder("x3r")));
//Integer <. x3r
cons.add(new LessDot(new NamedType("Integer", List.of()), new TypePlaceholder("x3r")));
//Matrix <. ret
cons.add(new LessDot(new NamedType("Matrix", List.of()), new TypePlaceholder("ret")));
//Integer <. i
cons.add(new LessDot(new NamedType("Integer", List.of()), new TypePlaceholder("i")));
//Matrix <. Vector<x?>
cons.add(new LessDot(new NamedType("Matrix", List.of()), new NamedType("Vector", List.of(new TypePlaceholder("x")))));
//x? <. v1
cons.add(new LessDot(new TypePlaceholder("x"), new TypePlaceholder("v1")));
//i <. Integer
cons.add(new LessDot(new TypePlaceholder("i"), new NamedType("Integer", List.of())));
//Vector<Integer> <. v2
cons.add(new LessDot(new NamedType("Vector", List.of(new NamedType("Integer", List.of()))), new TypePlaceholder("v2")));
//v1 <. Vector<y?>
cons.add(new LessDot(new TypePlaceholder("v1"), new NamedType("Vector", List.of(new TypePlaceholder("y")))));
//m <. Vector<z?>
cons.add(new LessDot(new TypePlaceholder("m"), new NamedType("Vector", List.of(new TypePlaceholder("z")))));
//z? <. zr
cons.add(new LessDot(new TypePlaceholder("z"), new TypePlaceholder("zr")));
//zr <. Vector<z2?>
cons.add(new LessDot(new TypePlaceholder("z"), new TypePlaceholder("zr")));
//z2? <. z2r
//z2r <. Integer
//v1 <. Vector<y2?>
//y2? <. y2r
//y2r <. Integer
cons.add(new LessDot(new TypePlaceholder("z2"), new TypePlaceholder("z2r"))); // z2? <. z2r
cons.add(new LessDot(new TypePlaceholder("z2r"), new NamedType("Integer", List.of()))); // z2r <. Integer
cons.add(new LessDot(new TypePlaceholder("v1"), new NamedType("Vector", List.of(new TypePlaceholder("y2"))))); // v1 <. Vector<y2?>
cons.add(new LessDot(new TypePlaceholder("y2"), new TypePlaceholder("y2r"))); // y2? <. y2r
cons.add(new LessDot(new TypePlaceholder("y2r"), new NamedType("Integer", List.of()))); // y2r <. Integer
for(Pair p : cons){
System.out.println(p.toASP() + ".");
}
System.out.println(ASPGenerator.generateUndCons(cons));
}
private List<Set<Pair>> generateOrConstraintTwoSolutions(String name){
return List.of(genOrConstraintWithOneSolution(name+"1"), genOrConstraintWithOneSolution(name+"2"));
}
private Set<Pair> genOrConstraintWithOneSolution(String name){
Type type1 = new TypePlaceholder(name);
Type type2 = new NamedType("List", List.of(new NamedType("Integer", List.of())));
Pair pair1 = new LessDot(type2, type1);
type1 = new TypePlaceholder(name);
type2 = new NamedType("List", List.of(new TypePlaceholder(name+"2")));
Pair pair2 = new LessDot(type1, type2);
Set<Pair> undCons2 = Set.of(pair1, pair2);
return undCons2;
}
/*
private UnifyPair genPairListOfInteger(String name){
UnifyType type1 = new PlaceholderType(name);
@@ -952,12 +76,13 @@ public class UnifyTest {
TypeUnify unifyAlgo = new TypeUnify();
ConstraintSet<Pair> cons = new ConstraintSet<>();
UnifyResultModelParallel urm = new UnifyResultModelParallel(cons, finiteClosure);
UnifyTaskModelParallel tasks = new UnifyTaskModelParallel();
UnifyResultModel urm = new UnifyResultModel(cons, finiteClosure);
UnifyTaskModel tasks = new UnifyTaskModel();
Set<Set<UnifyPair>> solution = unifyAlgo.unify(undConstraints, oderConstraints, finiteClosure, new NullWriter(), false, urm, tasks);
System.out.println(solution.size());
//System.out.println(solution);
}
@Test
public void basicMatrixTest(){
UnifyType type1;
@@ -1060,7 +185,7 @@ public class UnifyTest {
type2 = new ReferenceType("Vector", new TypeParams(new ReferenceType("Vector", new TypeParams(new ReferenceType("Integer")))));
constraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//Vector<X> extends Object
type1 = new ReferenceType("Vector", new TypeParams(new PlaceholderType("X")));
type1 = new ReferenceType("Vector", new TypeParams(new ReferenceType("X")));
type2 = new ReferenceType("Object");
constraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//Integer extends Object
@@ -1071,8 +196,8 @@ public class UnifyTest {
TypeUnify unifyAlgo = new TypeUnify();
ConstraintSet< Pair> cons = new ConstraintSet<>();
UnifyResultModelParallel urm = new UnifyResultModelParallel(cons, finiteClosure);
UnifyTaskModelParallel tasks = new UnifyTaskModelParallel();
UnifyResultModel urm = new UnifyResultModel(cons, finiteClosure);
UnifyTaskModel tasks = new UnifyTaskModel();
Set<Set<UnifyPair>> solution = unifyAlgo.unify(undConstraints, oderConstraints, finiteClosure, new NullWriter(), false, urm, tasks);
System.out.println(solution.size());
}
@@ -1547,8 +672,8 @@ public class UnifyTest {
FiniteClosure finiteClosure = new FiniteClosure(fcConstraints, new NullWriter());
TypeUnify unifyAlgo = new TypeUnify();
ConstraintSet< Pair> cons = new ConstraintSet<>();
UnifyResultModelParallel urm = new UnifyResultModelParallel(cons, finiteClosure);
UnifyTaskModelParallel tasks = new UnifyTaskModelParallel();
UnifyResultModel urm = new UnifyResultModel(cons, finiteClosure);
UnifyTaskModel tasks = new UnifyTaskModel();
Set<Set<UnifyPair>> solution = unifyAlgo.unify(undConstraints, oderConstraints, finiteClosure, new NullWriter(), false, urm, tasks);
System.out.println(solution.size());
}
@@ -2108,8 +1233,8 @@ public class UnifyTest {
FiniteClosure finiteClosure = new FiniteClosure(fcConstraints, new NullWriter());
TypeUnify unifyAlgo = new TypeUnify();
ConstraintSet< Pair> cons = new ConstraintSet<>();
UnifyResultModelParallel urm = new UnifyResultModelParallel(cons, finiteClosure);
UnifyTaskModelParallel tasks = new UnifyTaskModelParallel();
UnifyResultModel urm = new UnifyResultModel(cons, finiteClosure);
UnifyTaskModel tasks = new UnifyTaskModel();
Set<Set<UnifyPair>> solution = unifyAlgo.unify(undConstraints, oderConstraints, finiteClosure, new NullWriter(), false, urm, tasks);
System.out.println(solution.size());
}
@@ -2217,7 +1342,7 @@ public class UnifyTest {
//oder-constraints
List<Set<Constraint<UnifyPair>>> oderConstraints = new ArrayList<>();
Set<Constraint<UnifyPair>> constraints = new HashSet<>();
HashSet<UnifyPair> constraint = new HashSet<>();
Constraint<UnifyPair> constraint = new Constraint<>();
//set #1
constraints = new HashSet<>();
@@ -2292,7 +1417,7 @@ public class UnifyTest {
//set #4
constraints = new HashSet<>();
//ALC =. P
constraint = new HashSet<UnifyPair>();
constraint = new Constraint<>();
type1 = new PlaceholderType("ALC");
type2 = new PlaceholderType("P");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
@@ -2971,8 +2096,12 @@ public class UnifyTest {
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
FiniteClosure finiteClosure = new FiniteClosure(fcConstraints, new NullWriter());
ASPGenerator.generateASP(undConstraints);
TypeUnify unifyAlgo = new TypeUnify();
ConstraintSet< Pair> cons = new ConstraintSet<>();
UnifyResultModel urm = new UnifyResultModel(cons, finiteClosure);
UnifyTaskModel tasks = new UnifyTaskModel();
Set<Set<UnifyPair>> solution = unifyAlgo.unify(undConstraints, oderConstraints, finiteClosure, new NullWriter(), false, urm, tasks);
System.out.println(solution.size());
}
*/
}