Compare commits
51
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
79c9191dd2 | ||
|
|
e65260fc28 | ||
|
|
5e9cac84d3 | ||
|
|
6057af29f5 | ||
|
|
9affd1ba8f | ||
|
|
5807f2bca8 | ||
|
|
738bb40634 | ||
|
|
c0dcc8209d | ||
|
|
811dcdcfee | ||
|
|
76da1a473b | ||
|
|
b1c52f790f | ||
|
|
bf8e179dfd | ||
|
|
db3f3bcbac | ||
|
|
163e130b13 | ||
|
|
cddf3ccece | ||
|
|
8b55d8f159 | ||
|
|
02275e0b41 | ||
|
|
3c0f0dcf55 | ||
|
|
af0dad2b09 | ||
|
|
2887b8936d | ||
|
|
2827098a27 | ||
|
|
cd017ba665 | ||
|
|
2cf39b3b8c | ||
|
|
33b4710dac | ||
|
|
cb99c79213 | ||
|
|
d82c4d3ebf | ||
|
|
536fe9239e | ||
|
|
2b7b17060a | ||
|
|
313b021fdc | ||
|
|
e448d19616 | ||
|
|
7818722c96 | ||
|
|
4dec73cada | ||
|
|
7d3ef78ccd | ||
|
|
d8f744a774 | ||
|
|
48293b3243 | ||
|
|
bab3511259 | ||
|
|
46eb7b12e6 | ||
|
|
80c3e5d02c | ||
|
|
cb9798dd5a | ||
|
|
0cdbc7a19a | ||
|
|
3bb7f38805 | ||
|
|
6a92b0f194 | ||
|
|
7e5e63dc5f | ||
|
|
69402677f7 | ||
|
|
2ffa86e821 | ||
|
|
f75d646a73 | ||
|
|
ce2401f3eb | ||
|
|
996ef1a735 | ||
|
|
2bb2f1a898 | ||
|
|
cf8653567c | ||
|
|
72908f6fb4 |
No files matched your search
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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 ;
|
||||
@@ -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.
|
||||
@@ -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)).
|
||||
@@ -0,0 +1 @@
|
||||
#show sigma/2.
|
||||
@@ -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.
|
||||
@@ -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), _).
|
||||
@@ -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.
|
||||
@@ -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).
|
||||
@@ -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).
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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(Runtime.getRuntime().availableProcessors(), ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
|
||||
pool.invoke(unifyTask);
|
||||
Set<Set<UnifyPair>> res = unifyTask.join();
|
||||
try {
|
||||
logFile.write("\nnoShortendElements: " + unifyTask.noShortendElements + "\n");
|
||||
logFile.flush();
|
||||
}
|
||||
catch (IOException e) {
|
||||
System.err.println("no log-File");
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* unify asynchron mit Rückgabe UnifyResultModel ohne dass alle results gesammelt sind
|
||||
* @param undConstrains
|
||||
* @param oderConstraints
|
||||
* @param fc
|
||||
* @param logFile
|
||||
* @param log
|
||||
* @param cons
|
||||
* @param ret
|
||||
* @return
|
||||
*/
|
||||
public UnifyResultModel unifyAsync(Set<UnifyPair> undConstrains, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) {
|
||||
TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks);
|
||||
ForkJoinPool pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors(), ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
|
||||
pool.invoke(unifyTask);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* unify parallel mit Rückgabe UnifyResultModel nachdem alle results gesammelt sind
|
||||
* @param undConstrains
|
||||
* @param oderConstraints
|
||||
* @param fc
|
||||
* @param logFile
|
||||
* @param log
|
||||
* @param cons
|
||||
* @param ret
|
||||
* @return
|
||||
*/
|
||||
public UnifyResultModel unifyParallel(Set<UnifyPair> undConstrains, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) {
|
||||
TypeUnifyTask unifyTask = //new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks);
|
||||
new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks, statistics);
|
||||
ForkJoinPool pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors(), ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
|
||||
pool.invoke(unifyTask);
|
||||
Set<Set<UnifyPair>> res = unifyTask.join();
|
||||
try {
|
||||
logFile.write("\nnoShortendElements: " + unifyTask.noShortendElements +"\n");
|
||||
logFile.flush();
|
||||
unifyTask.statistics.write("Backtracking: " + unifyTask.noBacktracking);
|
||||
unifyTask.statistics.write("\nLoops: " + unifyTask.noLoop);
|
||||
}
|
||||
catch (IOException e) {
|
||||
System.err.println("no log-File");
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
public Set<Set<UnifyPair>> unifySequential(Set<UnifyPair> eq, IFiniteClosure fc, FileWriter logFile, Boolean log) {
|
||||
TypeUnifyTask unifyTask = new TypeUnifyTask(eq, fc, false, logFile, log);
|
||||
Set<Set<UnifyPair>> res = unifyTask.compute();
|
||||
return res;
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
* unify sequentiell mit oderconstraints
|
||||
* @param undConstrains
|
||||
* @param oderConstraints
|
||||
* @param fc
|
||||
* @param logFile
|
||||
* @param log
|
||||
* @param cons
|
||||
* @return
|
||||
*/
|
||||
public Set<Set<UnifyPair>> unifyOderConstraints(Set<UnifyPair> undConstrains, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) {
|
||||
TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, false, logFile, log, 0, ret, usedTasks);
|
||||
unifyTask.statistics = statistics;
|
||||
Set<Set<UnifyPair>> res = unifyTask.compute();
|
||||
try {
|
||||
logFile.write("\nnoShortendElements: " + unifyTask.noShortendElements +"\n");
|
||||
logFile.flush();
|
||||
}
|
||||
catch (IOException e) {
|
||||
System.err.println("no log-File");
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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,211 +0,0 @@
|
||||
package de.dhbwstuttgart.typeinference.unify.model;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
|
||||
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 ArrayList<String> EXISTING_PLACEHOLDERS = new ArrayList<String>();
|
||||
|
||||
/**
|
||||
* 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 synchronized 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 }
|
||||
@@ -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"));
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
+2904
-11
File diff suppressed because it is too large.
Load diff
Reference in new issue
Block a user