Skip to content

Commit e96efca

Browse files
author
jcompagne
committed
restparam (varargs) support: (for docs not js..) http://wiki.ecmascript.org/doku.php?id=harmony:rest_parameters&s=rest
1 parent 3e2687b commit e96efca

File tree

4 files changed

+81
-22
lines changed

4 files changed

+81
-22
lines changed

plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/ti/JSDocSupport.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,15 @@ private void parseParams(IMethod method, String comment) {
111111
index + PARAM_TAG.length(), endLineIndex);
112112
StringTokenizer st = new StringTokenizer(parameterString);
113113
String type = null;
114+
boolean varargs = false;
114115
while (st.hasMoreTokens()) {
115116
final String token = st.nextToken();
116117
if (token.startsWith("{") && token.endsWith("}")) {
117118
type = token.substring(1, token.length() - 1);
119+
if (type.startsWith("...")) {
120+
varargs = true;
121+
type = type.substring(3);
122+
}
118123
} else {
119124
final IParameter parameter;
120125
boolean optional = false;
@@ -164,6 +169,7 @@ private void parseParams(IMethod method, String comment) {
164169
&& st.nextToken().equals("optional"))
165170
optional = true;
166171
parameter.setOptional(optional);
172+
parameter.setVarargs(varargs);
167173
}
168174
break;
169175
}

plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/ti/JSMethod.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ private static class Parameter implements IParameter {
103103
private ReferenceLocation location = ReferenceLocation.UNKNOWN;
104104
private boolean optional;
105105
private Type propertiesType;
106+
private boolean varargs;
106107

107108
public String getName() {
108109
return name;
@@ -136,6 +137,14 @@ public boolean isOptional() {
136137
return optional;
137138
}
138139

140+
public void setVarargs(boolean varargs) {
141+
this.varargs = varargs;
142+
}
143+
144+
public boolean isVarargs() {
145+
return varargs;
146+
}
147+
139148
public Type getPropertiesType() {
140149
return propertiesType;
141150
}

plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/validation/TypeInfoValidator.java

Lines changed: 56 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -456,40 +456,68 @@ private void reportMethodParameterError(ASTNode methodNode,
456456

457457
private boolean validateParameters(List<IParameter> parameters,
458458
IValueReference[] arguments) {
459-
if (arguments.length > parameters.size())
459+
if (arguments.length > parameters.size()
460+
&& !(parameters.size() > 0 && parameters.get(
461+
parameters.size() - 1).isVarargs()))
460462
return false;
461463
int testTypesSize = parameters.size();
462-
if (parameters.size() != arguments.length) {
464+
if (parameters.size() > arguments.length) {
463465
for (int i = arguments.length; i < parameters.size(); i++) {
464466
if (!parameters.get(i).isOptional())
465467
return false;
466468
}
467469
testTypesSize = arguments.length;
470+
} else if (parameters.size() < arguments.length) {
471+
// is var args..
472+
testTypesSize = parameters.size() - 1;
468473
}
469474

470475
for (int i = 0; i < testTypesSize; i++) {
471-
String param = parameters.get(i).getType();
472-
if (arguments[i] == null)
473-
continue;
474-
Type argumentType = arguments[i].getDeclaredType();
475-
if (argumentType == null) {
476-
if (!arguments[i].getTypes().isEmpty()) {
477-
argumentType = arguments[i].getTypes().iterator()
478-
.next();
479-
}
480-
}
481-
if (param != null && param != null
482-
&& argumentType != null
483-
&& !param.equals(argumentType.getName())) {
484-
String argumentName = argumentType.getName();
485-
int index = argumentName.indexOf('<');
486-
if (index != -1) {
487-
argumentName = argumentName.substring(0, index);
488-
}
489-
if (param.equals(argumentName))
490-
continue;
476+
String paramType = parameters.get(i).getType();
477+
IValueReference argument = arguments[i];
478+
if (!testArgumentType(paramType, argument))
491479
return false;
480+
}
481+
// test var args
482+
if (parameters.size() < arguments.length) {
483+
int varargsParameter = parameters.size() - 1;
484+
String paramType = parameters.get(varargsParameter).getType();
485+
486+
for (int i = varargsParameter; i < arguments.length; i++) {
487+
IValueReference argument = arguments[i];
488+
if (!testArgumentType(paramType, argument))
489+
return false;
490+
}
491+
492+
}
493+
return true;
494+
}
495+
496+
/**
497+
* @param paramType
498+
* @param argument
499+
* @return
500+
*/
501+
private boolean testArgumentType(String paramType,
502+
IValueReference argument) {
503+
if (argument == null)
504+
return true;
505+
Type argumentType = argument.getDeclaredType();
506+
if (argumentType == null) {
507+
if (!argument.getTypes().isEmpty()) {
508+
argumentType = argument.getTypes().iterator().next();
509+
}
510+
}
511+
if (paramType != null && paramType != null && argumentType != null
512+
&& !paramType.equals(argumentType.getName())) {
513+
String argumentName = argumentType.getName();
514+
int index = argumentName.indexOf('<');
515+
if (index != -1) {
516+
argumentName = argumentName.substring(0, index);
492517
}
518+
if (paramType.equals(argumentName))
519+
return true;
520+
return false;
493521
}
494522
return true;
495523
}
@@ -524,7 +552,13 @@ private String describeParamTypes(List<IParameter> parameters) {
524552
sb.append(',');
525553
}
526554
if (parameter.getType() != null) {
555+
if (parameter.isOptional())
556+
sb.append("[");
557+
if (parameter.isVarargs())
558+
sb.append("...");
527559
sb.append(parameter.getType());
560+
if (parameter.isOptional())
561+
sb.append("]");
528562
} else {
529563
sb.append('?');
530564
}

plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/javascript/typeinfo/IModelBuilder.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,16 @@ public interface IParameter extends IElement {
7070
*/
7171
boolean isOptional();
7272

73+
/**
74+
* @since 3.0
75+
*/
76+
void setVarargs(boolean varargs);
77+
78+
/**
79+
* @since 3.0
80+
*/
81+
boolean isVarargs();
82+
7383
/**
7484
* @since 3.0
7585
*/

0 commit comments

Comments
 (0)