/
CFunction.java
132 lines (113 loc) · 2.95 KB
/
CFunction.java
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package com.laytonsmith.core.constructs;
import com.laytonsmith.PureUtilities.Common.ReflectionUtils;
import com.laytonsmith.PureUtilities.Version;
import com.laytonsmith.core.ParseTree;
import com.laytonsmith.core.exceptions.ConfigCompileException;
import com.laytonsmith.core.functions.Function;
import com.laytonsmith.core.functions.FunctionBase;
import com.laytonsmith.core.functions.FunctionList;
import com.laytonsmith.core.natives.interfaces.Mixed;
/**
*
*
*/
public class CFunction extends Construct {
public static final long serialVersionUID = 1L;
private transient Function function;
public CFunction(String name, Target t) {
super(name, ConstructType.FUNCTION, t);
}
@Override
public String toString() {
return val();
}
@Override
public CFunction clone() throws CloneNotSupportedException {
return (CFunction) super.clone();
}
@Override
public boolean isDynamic() {
return true;
}
/**
* Returns true if this CFunction is expected to represent a procedure based on the format.
*
* @return
*/
public boolean hasProcedure() {
return val().charAt(0) == '_' && val().charAt(1) != '_';
}
/**
* Returns true if this CFunction is expected to represent an IVariable based on the format.
*
* @return
*/
public boolean hasIVariable() {
return val().charAt(0) == '@';
}
/**
* Returns true if this CFunction is expected to represent a function based on the format.
*
* @return
*/
public boolean hasFunction() {
return !hasProcedure() && !hasIVariable();
}
/**
* Returns the underlying function for this construct.
*
* @return
* @throws com.laytonsmith.core.exceptions.ConfigCompileException
*/
public Function getFunction() throws ConfigCompileException {
if(function == null) {
function = (Function) FunctionList.getFunction(val(), null, this.getTarget());
}
return function;
}
/**
* This function should only be called by the compiler.
*
* @param f
*/
public void setFunction(FunctionBase f) {
function = (Function) f;
}
/**
* Returns true if the Construct is a function, and is of the specified type.
*
* @param possibleFunction
* @param ofType
* @return
*/
public static boolean IsFunction(Mixed possibleFunction, Class<? extends Function> ofType) {
Function f = ReflectionUtils.newInstance(ofType);
return possibleFunction instanceof CFunction && possibleFunction.val().equals(f.getName());
}
/**
* Returns true if the data in the ParseTree is a function, and is of the specified type.
*
* @param tree
* @param ofType
* @return
*/
public static boolean IsFunction(ParseTree tree, Class<? extends Function> ofType) {
return IsFunction(tree.getData(), ofType);
}
@Override
public Version since() {
return super.since();
}
@Override
public String docs() {
return super.docs();
}
@Override
public CClassType[] getSuperclasses() {
return new CClassType[]{Mixed.TYPE};
}
@Override
public CClassType[] getInterfaces() {
return new CClassType[]{};
}
}