Compare commits

..
Author SHA1 Message Date
stanandClaude Opus 5 79c9191dd2 Document the CLI and the cycle pre-check
Covers the four subcommands, which encoding is the live one and why
(unifyFinal.lp, not unifyDiss.lp), and the reasoning behind the pre-check.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015GFjH5RecLNshbBUac66yz
2026-08-24 21:50:08 +02:00
stanandClaude Opus 5 e65260fc28 Add a Main CLI so a shell pipeline can drive the translation steps
Four subcommands over this project's existing translation entry points, so
../pipeline.sh can call in without embedding a JVM:

  gen-facts <cons> <out.lp>          constraints -> ASP facts for clingo
  cycle-check-facts <cons> <out.lp>  the same input as cycleCheck.lp facts
  gen-facts-pruned <cons> <sel> <out.lp>
                                     facts with the or-constraint alternatives
                                     the pre-check ruled out left off
  parse-solution <answer-set> <out.json>
                                     clingo's answer set -> a flat
                                     {"placeholder": "type"} map for
                                     JavaConstraintGenerator's --apply

The jar's manifest main class moves from de.dhbwstuttgart.core.ConsoleInterface
to this, since the jar is now built to be run as a pipeline stage rather than as
the old compiler front end.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015GFjH5RecLNshbBUac66yz
2026-08-24 21:49:58 +02:00
stanandClaude Opus 5 5e9cac84d3 Add a cycle pre-check that runs before the solve
A constraint set that forces a placeholder to equal a type properly containing it
(`_r <. C<_p>` with `_p <. _res <. _r` gives `_p =. C<_p>`) has no finite
solution. The encoding says so - the Anti Cycle Conditions exist for exactly this
- but they are integrity constraints, evaluated only after grounding completes,
and on a cyclic set grounding is what never completes. The symptom is therefore
not UNSAT but a hang with Rules: 0, indefinitely (ASP_BUGS.md, Bug 5).

cycleCheck.lp reasons about placeholder identities alone and builds no type terms
at all, so it answers in milliseconds however deep the types would have been. Run
under --enum-mode=brave it does double duty: UNSAT means "cyclic, no finite
solution", reported immediately; otherwise the or-constraint alternatives that
appear in no acyclic selection are pruned before the real solve. On a set with
four cyclic alternatives and one acyclic one this turns "never finishes
grounding" into SATISFIABLE in 4 ms.

ASPGenerator.generateCycleCheckFacts emits the facts it consumes, and the
distinction between the two edge kinds is the whole point:

  containsEdge  solving P means solving Q *inside* P's own type (`_r <. C1<_p1>`).
                Only these can make a type contain itself.
  flowEdge      P's type flows into Q's (`_p <. _res`). A cycle of these alone is
                harmless - it just means the two are the same type.

Deliberately conservative: an edge is emitted only where the constraint genuinely
forces containment, so `C<_q> <. _p` contributes nothing, being a supertype of
C<_q> not obliging _p to contain _q. A missing edge only costs detection, with the
encoding's own Fail-Cycle left as the backstop; an invented one would reject a
satisfiable constraint set.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015GFjH5RecLNshbBUac66yz
2026-08-24 21:49:49 +02:00
stanandClaude Opus 5 6057af29f5 Add unifyFinal.lp: the dissertation appendix program as the live encoding
unifyDiss.lp is only a partial transcription of the algorithm. Measured against
the appendix listing in dissertation/chapters/unifyWithASP.tex
(\label{appendix:program}) it is missing the maxdepth(5) guard, the
Build/connect/Fail-circle anti-cycle conditions, fail-equals, and - the one that
mattered most - the restriction of subst to placeholder-free types, which the
appendix gets by deriving subst from sigma rather than from equalcons.

unifyFinal.lp transcribes that listing verbatim, minus its embedded test
constraint set and its trailing #show (show.lp supplies that instead, so the same
program can be run with different output selections). Over the 35-sample corpus
this fixes four samples and regresses none: the three method-reference samples
go from UNSATISFIABLE to compiling (ASP_BUGS.md Bug 3), and Return/SimpleReturn
stops producing uncompilable output. A self-referential bound `_a <.
java.util.List<_a>,` now comes back UNSATISFIABLE in 6 ms where unifyDiss.lp
never finished grounding it.

One rule is added on top, marked as such: fail-equals-ground. The appendix's own
fail-equals compares only the head class name, so `Vector<String> =.
Vector<Integer>` passes it; on ground terms the whole type can be compared,
arguments included. The connect rule is also corrected - the appendix prints
`connected(A,C) :- connected(A,B), connected(A,C).`, which repeats its head in
its body and therefore derives nothing, leaving Fail-Cycle blind to indirect
cycles.

jdkHierarchy.lp supplies base subtype/2 facts for the boxed numerics, Number,
Object, Boolean, Character and String. The encoding's reflexive and transitive
rules only propagate facts that already exist, and ASPGenerator emits subtype
facts only for extends relations found in the .cons input, so with no base facts
the "super" choice rule has an empty candidate set and every `concreteType <.
placeholder` constraint is unsatisfiable.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015GFjH5RecLNshbBUac66yz
2026-08-24 21:49:36 +02:00
stanandClaude Opus 5 9affd1ba8f Let the solution grammar lex the identifiers clingo actually prints
Solution.g4's IDENTIFIER accepted only [0-9A-Za-z.], which cannot lex the names
that occur in real answer sets:

  _Foo_3            JavaConstraintGenerator names every placeholder
                    "_<basename>_<counter>", so the internal underscore is the
                    common case, not an edge case
  [Ljava.lang.X;    reflected array types carry the JVM's descriptor syntax
  Outer$Inner       nested classes come back with the binary name separator

The leading underscore stays excluded from the token's first character, since the
tph rule spells that separately as part of its 'tph("_' literal.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015GFjH5RecLNshbBUac66yz
2026-08-24 21:49:19 +02:00
stanandClaude Opus 5 5807f2bca8 Note Fail-Subtype's dependency on a complete-enough subtype hierarchy
Without any subtype/2 fact mentioning a type, T <: T is underivable and the
check rejects the correct solution. repro_bug1.lp without jdkHierarchy.lp is
UNSAT where it previously returned wrong answers. pipeline.sh always passes
jdkHierarchy.lp, so only direct clingo callers are affected.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199LeXiNWHxurRzd3ZggejX
2026-08-04 00:18:15 +02:00
stanandClaude Opus 5 738bb40634 Correct README section on parameterized subtyping
The claim that subtype/2 cannot relate parameterized types was wrong. It was
measured against an uncommitted local change to
ASPGenerator.generateExtendsRelations that emitted extends relations as bare
facts with free variables instead of the committed guarded-rule form. That
change has been reverted.

The guard is not self-referential: the head is subtype/2, the body subtype/1 -
a distinct predicate that unifyDiss.lp:77 derives from subcons. The body binds
the parameter variable, which is what makes the rule safe and instantiates the
relation for the type arguments that actually occur.

With the guarded form restored, `_a <. Vector<Integer>` solves to Vector<Integer>
and no reflexivity rule is needed. ASP_BUGS.md Bug 4 does not reproduce, and
Bug 3's parameterized-extends form solves. The Bug 1 results are unchanged: the
37-sample suite and the 34-sample pipeline run give byte-identical results
either way.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199LeXiNWHxurRzd3ZggejX
2026-08-04 00:16:44 +02:00
stanandClaude Opus 5 c0dcc8209d Add missing Fail-Subtype condition to unifyDiss.lp
unifyDiss.lp had no fail conditions, so a placeholder could be solved with
a type violating its own upper bounds - most visibly java.lang.Object, which
the S-Object rules add as an upper bound for every placeholder. With
`clingo -n 1` the pipeline picked exactly such a model, typing e.g. an `if`
condition as java.lang.Object.

The violated constraint was already present in the model: subst-L rewrites
`_a <. Boolean` into the ground constraint `Object <. Boolean` once `_a` is
assigned, and nothing checked it. The sibling encodings all have this check
(unify.lp:118, unifyOrCons.lp:124, unifyPaper.lp:126); unifyDiss.lp did not.

Adds the Fail-Subtype rule of the dissertation
(dissertation/chapters/unifyWithASP.tex:723), restricted to ground types as
that text requires - a constraint still containing a placeholder is not yet
decided and must stay satisfiable by a later substitution. The rule uses
subtype/2 unchanged, on whole type terms, so the subtype hierarchy is not
weakened: a parameterized type still only conforms to a bound with the very
same parameters.

Fixes Bug 1 of ASP_BUGS.md. See README-bug1-fix.md for the reproduction,
the regression-suite results, and the two pre-existing defects (raw extends
relations, a missing return-type constraint) that this check now exposes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199LeXiNWHxurRzd3ZggejX
2026-08-04 00:09:38 +02:00
Andreas Stadelmeier 811dcdcfee Add Tests 2025-08-13 17:37:04 +02:00
Andreas Stadelmeier 76da1a473b Fix Test Input 2025-04-08 15:40:03 +02:00
Andreas Stadelmeier b1c52f790f Merge and add Unify Dissertation version 2025-04-08 15:38:55 +02:00
Andreas Stadelmeier bf8e179dfd Unify Dissertation Version added. Added Matrix Example as testInput 2025-04-08 15:32:00 +02:00
Andreas Stadelmeier db3f3bcbac Many Or Constraint test used for benchmark for KRRUP Seminar presentation 2024-11-28 13:12:30 +01:00
Andreas Stadelmeier 163e130b13 Fix Identifier in Grammar 2024-11-28 13:09:25 +01:00
Andreas Stadelmeier cddf3ccece Add Or Cons Test 2024-11-26 13:51:45 +01:00
Andreas Stadelmeier 8b55d8f159 rename pl -> lp 2024-09-11 09:46:54 +02:00
Andreas Stadelmeier 02275e0b41 Comment out coConsTest 2024-07-16 15:39:21 +02:00
stan 3c0f0dcf55 Fix Parser. Add Numbers for Identifiers 2024-07-01 12:37:27 +02:00
stan af0dad2b09 OL example and fix orCOnstraints 2024-07-01 12:37:00 +02:00
stan 2887b8936d o <. Object does not work 2024-06-28 11:58:01 +02:00
JanUlrich 2827098a27 Change super to subtype in ASP generation 2024-06-27 21:52:36 +02:00
JanUlrich cd017ba665 Fix Constraint Set Grammar. Add Or Constraint Test 2024-06-23 00:45:49 +02:00
stan 2cf39b3b8c Change ASP Generator and add Solution Parser 2024-06-21 02:33:15 +02:00
JanUlrich 33b4710dac New Algorithm with Matrix input 2024-06-19 23:15:52 +02:00
Andreas Stadelmeier cb99c79213 Start Implementation of the Algorithm described in the paper 2024-06-18 18:44:11 +02:00
stan d82c4d3ebf First Workin Matrix Test 2024-06-10 08:57:04 +02:00
stan 536fe9239e Fix 2024-06-07 11:16:41 +02:00
stan 2b7b17060a Implement Parser 2024-06-07 10:51:42 +02:00
JanUlrich 313b021fdc Implement First Test 2024-06-06 20:38:03 +02:00
Andreas Stadelmeier e448d19616 Add Unify ASP prototype. Start implementing tests and Constraint -> ASP Input 2024-06-05 20:03:18 +02:00
NoName11234 7818722c96 fixed missing oderConstraints 2024-05-23 10:50:44 +02:00
NoName11234 4dec73cada implemented scalark3 test 2024-05-22 20:48:26 +02:00
NoName11234 7d3ef78ccd small changes for compatibility of matrixk2 test 2024-05-17 14:56:04 +02:00
NoName11234 d8f744a774 added matrixk2 test 2024-05-17 14:47:30 +02:00
NoName11234 48293b3243 reworked test for changes to multithreading 2024-05-15 15:50:34 +02:00
NoName11234 bab3511259 implemented scalark2test 2024-05-15 15:49:18 +02:00
NoName11234 46eb7b12e6 added matrix test 2024-05-10 20:25:11 +02:00
NoName11234 80c3e5d02c fixed issues from merging 2024-05-10 19:15:22 +02:00
NoName11234 cb9798dd5a Merge branch 'performanceTestRecursionOptimization' into newMain 2024-05-10 18:55:58 +02:00
NoName11234 0cdbc7a19a Merge branch 'performanceTestUnifyResultModel' into newMain 2024-05-10 18:46:13 +02:00
NoName11234 3bb7f38805 implemented ConstraintSetRepository 2024-05-01 20:05:28 +02:00
NoName11234 6a92b0f194 added class ConstraintSetRepository 2024-05-01 19:42:24 +02:00
NoName11234 7e5e63dc5f removed class UnifyResultModel 2024-04-29 22:18:25 +02:00
NoName11234 69402677f7 implemented UnifyTaskModelParallel 2024-04-29 22:14:24 +02:00
NoName11234 2ffa86e821 added class UnifyTaskModelParallel 2024-04-29 21:43:30 +02:00
NoName11234 f75d646a73 implemented UnifyResultModelParallel 2024-04-29 19:53:25 +02:00
NoName11234 ce2401f3eb added class UnifyResultModelParallel 2024-04-29 16:53:23 +02:00
NoName11234 996ef1a735 Merge branch 'performanceTestPlaceholderGenerator' into performanceTestBase 2024-04-26 12:51:00 +02:00
NoName11234 2bb2f1a898 Merge branch 'performanceTestThreadCounter' into performanceTestBase 2024-04-26 12:50:44 +02:00
NoName11234 72908f6fb4 removed variance from typeunifytask 2024-04-25 19:08:26 +02:00
NoName11234 dd62d8d6b9 removed thread counter variables from typeunifytask 2024-04-25 16:50:14 +02:00
NoName11234 dc803bd6b8 changed parameters of forkjoinpools 2024-04-25 16:49:39 +02:00
80 changed files with 7018 additions and 7833 deletions

No files matched your search

+275
View File
@@ -0,0 +1,275 @@
# 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
@@ -0,0 +1,83 @@
# 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.
+3 -4
View File
@@ -53,7 +53,6 @@ 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>
@@ -77,7 +76,7 @@ http://maven.apache.org/maven-v4_0_0.xsd">
<configuration>
<archive>
<manifest>
<mainClass>de.dhbwstuttgart.core.ConsoleInterface</mainClass>
<mainClass>de.dhbwstuttgart.Main</mainClass>
</manifest>
</archive>
</configuration>
@@ -95,7 +94,7 @@ http://maven.apache.org/maven-v4_0_0.xsd">
<configuration>
<archive>
<manifest>
<mainClass>de.dhbwstuttgart.core.ConsoleInterface</mainClass>
<mainClass>de.dhbwstuttgart.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
@@ -114,7 +113,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.core.ConsoleInterface</mainClass>
<mainClass>de.dhbwstuttgart.Main</mainClass>
</properties>
<distributionManagement>
<repository>
@@ -0,0 +1,23 @@
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 ;
@@ -0,0 +1,11 @@
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
@@ -0,0 +1,51 @@
%==============================================================================================
% 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
@@ -0,0 +1,29 @@
% 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
@@ -0,0 +1 @@
#show sigma/2.
+41
View File
@@ -0,0 +1,41 @@
% 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
@@ -0,0 +1,10 @@
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
@@ -0,0 +1,127 @@
% 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
@@ -0,0 +1,166 @@
% 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
@@ -0,0 +1,426 @@
%==============================================================================================
% 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
@@ -0,0 +1,153 @@
% 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
@@ -0,0 +1,155 @@
% 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
@@ -0,0 +1,234 @@
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.");
}
}
@@ -1,7 +0,0 @@
package de.dhbwstuttgart.exceptions;
public class DebugException extends RuntimeException{
public DebugException(String message){
System.err.println(message);
}
}
@@ -0,0 +1,87 @@
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());
}
}
}
@@ -0,0 +1,37 @@
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;
}
}
@@ -0,0 +1,148 @@
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;
}
}
@@ -0,0 +1,8 @@
package de.dhbwstuttgart.sat.asp;
public record EqualsDot(Type left, Type right) implements Pair {
@Override
public String toASP() {
return "equalcons("+ left().toASP() + "," + right().toASP() + ")";
}
}
@@ -0,0 +1,6 @@
package de.dhbwstuttgart.sat.asp;
import java.util.List;
public record ExtendsRelation(String subtypeName, List<TypeParameter> subtypeParams, NamedType superType) {
}
@@ -0,0 +1,8 @@
package de.dhbwstuttgart.sat.asp;
public record LessDot(Type left, Type right) implements Pair {
@Override
public String toASP() {
return "subcons("+ left().toASP() + "," + right().toASP() + ")";
}
}
@@ -0,0 +1,12 @@
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)";
}
}
@@ -0,0 +1,5 @@
package de.dhbwstuttgart.sat.asp;
public interface Pair {
String toASP();
}
@@ -0,0 +1,6 @@
package de.dhbwstuttgart.sat.asp;
public interface Type {
String name();
String toASP();
}
@@ -0,0 +1,8 @@
package de.dhbwstuttgart.sat.asp;
public record TypeParameter(String name) implements Type{
@Override
public String toASP() {
return "X"+name;
}
}
@@ -0,0 +1,8 @@
package de.dhbwstuttgart.sat.asp;
public record TypePlaceholder(String name) implements Type {
@Override
public String toASP() {
return "tph(\""+name+"\")";
}
}
@@ -1,69 +0,0 @@
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();
}
}
@@ -1,126 +0,0 @@
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;
}
}
@@ -1,13 +0,0 @@
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
@@ -1,23 +0,0 @@
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);
}
}
@@ -1,108 +0,0 @@
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);
}
}
@@ -1,92 +0,0 @@
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
@@ -1,125 +0,0 @@
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();
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();
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();
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;
}
}
@@ -1,76 +0,0 @@
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
@@ -1,11 +0,0 @@
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);
}
@@ -1,18 +0,0 @@
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;
}
}
@@ -1,7 +0,0 @@
package de.dhbwstuttgart.typeinference.unify;
public interface UnifyResultListener {
void onNewTypeResultFound(UnifyResultEvent evt);
}
@@ -1,21 +0,0 @@
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;
}
}
@@ -1,41 +0,0 @@
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) {
}
}
@@ -1,18 +0,0 @@
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);
}
}
}
@@ -1,54 +0,0 @@
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));
}
}
@@ -1,15 +0,0 @@
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);
}
}
@@ -1,68 +0,0 @@
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);
}
@@ -1,29 +0,0 @@
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);
}
@@ -1,103 +0,0 @@
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);
}
@@ -1,16 +0,0 @@
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);
}
@@ -1,35 +0,0 @@
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()));
}
}
@@ -1,23 +0,0 @@
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);
}
@@ -1,96 +0,0 @@
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;
}
}
@@ -1,772 +0,0 @@
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;
}
}
}
}
@@ -1,103 +0,0 @@
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);
}
}
@@ -1,118 +0,0 @@
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";
}
}
@@ -1,89 +0,0 @@
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;
}
}
@@ -1,457 +0,0 @@
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;
}
}
@@ -1,49 +0,0 @@
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
}
}
}
@@ -1,208 +0,0 @@
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;
}
}
@@ -1,100 +0,0 @@
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);
}
}
@@ -1,88 +0,0 @@
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);
}
}
@@ -1,191 +0,0 @@
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;
}
}
@@ -1,189 +0,0 @@
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();
}
}
@@ -1,247 +0,0 @@
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;
}
*/
}
@@ -1,119 +0,0 @@
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());
}
}
@@ -1,72 +0,0 @@
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;
}
}
@@ -1,25 +0,0 @@
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();
}
}
@@ -1,47 +0,0 @@
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));
}
}
@@ -1,19 +0,0 @@
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);
}
}
@@ -1,25 +0,0 @@
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";
}
}
@@ -0,0 +1,427 @@
{ _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
@@ -0,0 +1,665 @@
{ _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 }
@@ -0,0 +1,651 @@
{
_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 }
@@ -0,0 +1,665 @@
{ _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
@@ -0,0 +1,97 @@
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
@@ -0,0 +1,101 @@
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
@@ -0,0 +1,44 @@
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));
}
}
}
+897 -26
View File
@@ -1,14 +1,12 @@
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 de.dhbwstuttgart.input.ConstraintParser;
import de.dhbwstuttgart.sat.asp.*;
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;
@@ -18,7 +16,885 @@ 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);
@@ -76,13 +952,12 @@ public class UnifyTest {
TypeUnify unifyAlgo = new TypeUnify();
ConstraintSet<Pair> cons = new ConstraintSet<>();
UnifyResultModel urm = new UnifyResultModel(cons, finiteClosure);
UnifyTaskModel tasks = new UnifyTaskModel();
UnifyResultModelParallel urm = new UnifyResultModelParallel(cons, finiteClosure);
UnifyTaskModelParallel tasks = new UnifyTaskModelParallel();
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;
@@ -185,7 +1060,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 ReferenceType("X")));
type1 = new ReferenceType("Vector", new TypeParams(new PlaceholderType("X")));
type2 = new ReferenceType("Object");
constraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//Integer extends Object
@@ -196,8 +1071,8 @@ public class UnifyTest {
TypeUnify unifyAlgo = new TypeUnify();
ConstraintSet< Pair> cons = new ConstraintSet<>();
UnifyResultModel urm = new UnifyResultModel(cons, finiteClosure);
UnifyTaskModel tasks = new UnifyTaskModel();
UnifyResultModelParallel urm = new UnifyResultModelParallel(cons, finiteClosure);
UnifyTaskModelParallel tasks = new UnifyTaskModelParallel();
Set<Set<UnifyPair>> solution = unifyAlgo.unify(undConstraints, oderConstraints, finiteClosure, new NullWriter(), false, urm, tasks);
System.out.println(solution.size());
}
@@ -672,8 +1547,8 @@ public class UnifyTest {
FiniteClosure finiteClosure = new FiniteClosure(fcConstraints, new NullWriter());
TypeUnify unifyAlgo = new TypeUnify();
ConstraintSet< Pair> cons = new ConstraintSet<>();
UnifyResultModel urm = new UnifyResultModel(cons, finiteClosure);
UnifyTaskModel tasks = new UnifyTaskModel();
UnifyResultModelParallel urm = new UnifyResultModelParallel(cons, finiteClosure);
UnifyTaskModelParallel tasks = new UnifyTaskModelParallel();
Set<Set<UnifyPair>> solution = unifyAlgo.unify(undConstraints, oderConstraints, finiteClosure, new NullWriter(), false, urm, tasks);
System.out.println(solution.size());
}
@@ -1233,8 +2108,8 @@ public class UnifyTest {
FiniteClosure finiteClosure = new FiniteClosure(fcConstraints, new NullWriter());
TypeUnify unifyAlgo = new TypeUnify();
ConstraintSet< Pair> cons = new ConstraintSet<>();
UnifyResultModel urm = new UnifyResultModel(cons, finiteClosure);
UnifyTaskModel tasks = new UnifyTaskModel();
UnifyResultModelParallel urm = new UnifyResultModelParallel(cons, finiteClosure);
UnifyTaskModelParallel tasks = new UnifyTaskModelParallel();
Set<Set<UnifyPair>> solution = unifyAlgo.unify(undConstraints, oderConstraints, finiteClosure, new NullWriter(), false, urm, tasks);
System.out.println(solution.size());
}
@@ -1342,7 +2217,7 @@ public class UnifyTest {
//oder-constraints
List<Set<Constraint<UnifyPair>>> oderConstraints = new ArrayList<>();
Set<Constraint<UnifyPair>> constraints = new HashSet<>();
Constraint<UnifyPair> constraint = new Constraint<>();
HashSet<UnifyPair> constraint = new HashSet<>();
//set #1
constraints = new HashSet<>();
@@ -1417,7 +2292,7 @@ public class UnifyTest {
//set #4
constraints = new HashSet<>();
//ALC =. P
constraint = new Constraint<>();
constraint = new HashSet<UnifyPair>();
type1 = new PlaceholderType("ALC");
type2 = new PlaceholderType("P");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
@@ -2096,12 +2971,8 @@ public class UnifyTest {
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
FiniteClosure finiteClosure = new FiniteClosure(fcConstraints, new NullWriter());
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());
ASPGenerator.generateASP(undConstraints);
}
*/
}