-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathJavaDBNameCheck.jrag
More file actions
133 lines (110 loc) · 4.78 KB
/
JavaDBNameCheck.jrag
File metadata and controls
133 lines (110 loc) · 4.78 KB
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
133
aspect JavaDBNameCheck {
eq L1ClassDecl.getOwnerClassAccess().nameType() = NameType.TYPE_NAME;
eq L1GenericClassDecl.getOwnerClassAccess().nameType() = NameType.TYPE_NAME;
//make geneic type visible for owner type
eq L1GenericClassDecl.getOwnerClassAccess().lookupType(String name) {
SimpleSet c = addTypeVariables(SimpleSet.emptySet, name);
return !c.isEmpty() ? c : lookupType(name);
}
eq L2ClassDecl.getMemberParameter(int i).nameType() = NameType.TYPE_NAME;
eq L2GenericClassDecl.getMemberParameter(int i).nameType() = NameType.TYPE_NAME;
eq L2GenericClassDecl.getMemberParameter(int i).lookupType(String name) {
SimpleSet c = addTypeVariables(SimpleSet.emptySet, name);
return !c.isEmpty() ? c : lookupType(name);
}
eq ParMemberAccess.getReceiverTypeAccess().nameType() = NameType.TYPE_NAME;
syn lazy boolean VarAccess.isParField() = isQualified() && hostType().memberParFields(qualifier().type(), name()) != null;
syn FieldVariable VarAccess.getParFieldVar() {
if (isParField()) {
return hostType().memberParFields(qualifier().type(), name());
} else return null;
}
syn lazy boolean MethodAccess.isParMethod() = isQualified() && hostType().memberParMethods(qualifier().type(), name(), getArgs()) != null;
syn MethodVariable MethodAccess.getParMethodVar() {
if (isParMethod()) {
return hostType().memberParMethods(qualifier().type(), name(), getArgs()); //TODO query by parameters
} else return null;
}
syn lazy boolean TypeDecl.isParMemberType() = false;
eq L2ClassDecl.isParMemberType() = true;
eq L2GenericClassDecl.isParMemberType() = true;
eq RawClassDecl.isParMemberType() = original().isParMemberType();
syn lazy List<MemberVariable> TypeDecl.getMemberPars() = new List();
eq L2ClassDecl.getMemberPars() = getMemberParameters();
eq L2GenericClassDecl.getMemberPars() = getMemberParameters();
eq RawClassDecl.getMemberPars() = original().getMemberPars();
eq ParClassDecl.getMemberPars() = original().getMemberPars();
// refine VariableScope eq Expr.qualifiedLookupVariable(String name) {
// // return VariableScope.Expr.qualifiedLookupVariable(name);
// if (type().accessibleFrom(hostType())) {
// //check if the field is field variable
// FieldVariable tmp = hostType().memberParFields(type(), name); //possibly hide the memberfields
// if (tmp == null)
// return keepAccessibleFields(type().memberFields(name));
// return SimpleSet.emptySet.add(tmp);
// }
// return SimpleSet.emptySet;
// }
refine Enums public void ClassInstanceExpr.nameCheck() {
TypeDecl ty = type();
if (type().isParMemberType()) {
if (this instanceof ParMemberClassInstanceExpr == false) {
error("class " + type().name() + " cannot be instantiated without any field argument");
}
}
refined();
}
refine NameCheck public void VarAccess.nameCheck() {
if (isParField()) {
//TODO: check subclass relation
} else
refined();
}
refine TypeHierarchyCheck public void MethodAccess.nameCheck() {
if (isParMethod()) {
//TODO: check subclass relation
} else
refined();
}
// public void ParMemberAccess.nameCheck() {
// super.nameCheck();
// SimpleSet decls = getTypeAccess().memberfields(getFieldName());
// if (decls == null || decls.size() < 1) {
// error(getFieldName() + " don't existed in class " + getTypeAccess().name());
// } else if (decls.size() > 1) {
// error("more than one field declare " + getFieldName() + " existed");
// }
// }
public void ParMemberClassInstanceExpr.nameCheck() {
super.nameCheck();
List<MemberVariable> memberPars = type().getMemberPars();
List<ParMemberAccess> memberArgs = this.getMemberArguments();
//TODO CHECK STATCI METHOD
if (memberPars.getNumChild() != memberArgs.getNumChild()) {
error("The number of field arguments to instantiated the class cannot match the declaration.");
}
else {
for (int i = 0; i < memberArgs.getNumChild(); i++) {
MemberVariable fv = memberPars.getChild(i);
ParMemberAccess fa = memberArgs.getChild(i);
if (fv instanceof FieldVariable) {
SimpleSet decls = fa.getReceiverTypeAccess().type().memberFields(fa.getMemberName());
if (fa.getFieldType() == null) {
error("no field or parameterized field named " + fa.getMemberName() + " is accessible");
}
} else {
Collection decls = fa.getReceiverTypeAccess().type().memberMethods(fa.getMemberName());
if (decls.isEmpty() && hostType().hasMemberParMethods(fa.getReceiverTypeAccess().type(), fa.getMemberName()) == false) {
error("no method or parameterized method named " + fa.getMemberName() + " is accessible");
}
}
}
}
}
rewrite PackageAccess {
when(!duringSyntacticClassification() && hasPrevExpr() && prevExpr() instanceof VarAccess)
to Access {
return new VarAccess(name(), start(), end());
}
}
}