Skip to content

Commit

Permalink
Argument is read-only when used default parameters.
Browse files Browse the repository at this point in the history
  • Loading branch information
uchida_t committed May 19, 2014
1 parent a51cc85 commit bbaabac
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 5 deletions.
9 changes: 7 additions & 2 deletions src/analysis.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -324,8 +324,13 @@ class ArgumentDeclaration extends LocalVariable {
this._defaultValue = defaultValue;
}

function constructor (name : Token, type : Type, isConst : boolean, defaultValue : Expression) {
super(name, type, isConst);
this._defaultValue = defaultValue;
}

function clone () : ArgumentDeclaration {
return new ArgumentDeclaration(this._name, this._type, Util.cloneNullable(this._defaultValue));
return new ArgumentDeclaration(this._name, this._type, this._isConstant, Util.cloneNullable(this._defaultValue));
}

function getDefaultValue() : Expression {
Expand All @@ -334,7 +339,7 @@ class ArgumentDeclaration extends LocalVariable {

override function _instantiate (instantiationContext : InstantiationContext) : ArgumentDeclaration {
var type = this._type != null ? this._type.instantiate(instantiationContext, false) : null;
return new ArgumentDeclaration(this._name, type, this._defaultValue);
return new ArgumentDeclaration(this._name, type, this._isConstant, this._defaultValue);
}

override function instantiateAndPush (instantiationContext : InstantiationContext) : ArgumentDeclaration {
Expand Down
2 changes: 1 addition & 1 deletion src/classdef.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -1698,7 +1698,7 @@ class MemberFunctionDefinition extends MemberDefinition implements Block {
for (; origArgIndex != this.getArguments().length; ++origArgIndex) {
// build list of formal args (of the generated function)
var formalArgs = this.getArguments().slice(0, origArgIndex).map.<ArgumentDeclaration>((arg) -> {
return new ArgumentDeclaration(arg.getName(), arg.getType());
return new ArgumentDeclaration(arg.getName(), arg.getType(), true, null);
});
// build function body
var argExprs = formalArgs.map.<Expression>((arg) -> {
Expand Down
11 changes: 9 additions & 2 deletions src/parser.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3409,6 +3409,7 @@ class Parser {

function _functionArgumentsExpr (allowVarArgs : boolean, requireTypeDeclaration : boolean, allowDefaultValues : boolean) : ArgumentDeclaration[] {
var args = new ArgumentDeclaration[];
var hasDefaultValue = false;
if (this._expectOpt(")") == null) {
var token = null : Token;
do {
Expand Down Expand Up @@ -3438,7 +3439,7 @@ class Parser {
// vararg is the last argument
if (argType == null && isVarArg)
throw new Error("not yet implemented!");
args.push(new ArgumentDeclaration(argName, new VariableLengthArgumentType(argType)));
args.push(new ArgumentDeclaration(argName, new VariableLengthArgumentType(argType), hasDefaultValue, null));
if (this._expect(")") == null)
return null;
break;
Expand All @@ -3447,6 +3448,12 @@ class Parser {
var assignToken = this._expectOpt("=");
if (assignToken != null) {
var state = this._preserveState();
if (!hasDefaultValue) {
args = args.map.<ArgumentDeclaration>((arg) -> {
return new ArgumentDeclaration(arg.getName(), arg.getType(), true, arg.getDefaultValue());
});
hasDefaultValue = true;
}
this._pushScope(null, args);
try {
if ((defaultValue = this._assignExpr(true)) == null) {
Expand All @@ -3469,7 +3476,7 @@ class Parser {
return null;
}
}
args.push(new ArgumentDeclaration(argName, argType, defaultValue));
args.push(new ArgumentDeclaration(argName, argType, hasDefaultValue, defaultValue));
token = this._expect([ ")", "," ]);
if (token == null)
return null;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
class C {

function fn(a : number, b : number = 10) {
a = 11;
}

}

0 comments on commit bbaabac

Please sign in to comment.