blob: 72b03913c982c30b6ee94263b24ea4717ef39910 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
/*******************************************************************************
* Copyright (c) 2015 Jeff Martin.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser General Public
* License v3.0 which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Contributors:
* Jeff Martin - initial API and implementation
******************************************************************************/
package cuchaz.enigma.translation.representation.entry;
import cuchaz.enigma.throwables.IllegalNameException;
import cuchaz.enigma.translation.Translatable;
import cuchaz.enigma.translation.mapping.NameValidator;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
public interface Entry<P extends Entry<?>> extends Translatable {
String getName();
String getJavadocs();
default String getSourceRemapName() {
return getName();
}
@Nullable
P getParent();
Class<P> getParentType();
Entry<P> withName(String name);
Entry<P> withParent(P parent);
boolean canConflictWith(Entry<?> entry);
@Nullable
default ClassEntry getContainingClass() {
P parent = getParent();
if (parent == null) {
return null;
}
if (parent instanceof ClassEntry) {
return (ClassEntry) parent;
}
return parent.getContainingClass();
}
default List<Entry<?>> getAncestry() {
P parent = getParent();
List<Entry<?>> entries = new ArrayList<>();
if (parent != null) {
entries.addAll(parent.getAncestry());
}
entries.add(this);
return entries;
}
@Nullable
@SuppressWarnings("unchecked")
default <E extends Entry<?>> E findAncestor(Class<E> type) {
List<Entry<?>> ancestry = getAncestry();
for (int i = ancestry.size() - 1; i >= 0; i--) {
Entry<?> ancestor = ancestry.get(i);
if (type.isAssignableFrom(ancestor.getClass())) {
return (E) ancestor;
}
}
return null;
}
@SuppressWarnings("unchecked")
default <E extends Entry<?>> Entry<P> replaceAncestor(E target, E replacement) {
if (replacement.equals(target)) {
return this;
}
if (equals(target)) {
return (Entry<P>) replacement;
}
P parent = getParent();
if (parent == null) {
return this;
}
return withParent((P) parent.replaceAncestor(target, replacement));
}
default void validateName(String name) throws IllegalNameException {
NameValidator.validateIdentifier(name);
}
@SuppressWarnings("unchecked")
@Nullable
default <C extends Entry<?>> Entry<C> castParent(Class<C> parentType) {
if (parentType.equals(getParentType())) {
return (Entry<C>) this;
}
return null;
}
}
|