blob: 84a9be2eed6371d7eefc3f30c404744da4ae5674 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.royale.compiler.internal.codegen.js.jx;
import org.apache.royale.compiler.codegen.ISubEmitter;
import org.apache.royale.compiler.codegen.js.IJSEmitter;
import org.apache.royale.compiler.common.IMetaInfo;
import org.apache.royale.compiler.internal.codegen.as.ASEmitterTokens;
import org.apache.royale.compiler.internal.codegen.js.JSSubEmitter;
import org.apache.royale.compiler.internal.codegen.js.royale.JSRoyaleEmitter;
import org.apache.royale.compiler.internal.tree.as.SetterNode;
import org.apache.royale.compiler.tree.as.IAccessorNode;
import org.apache.royale.compiler.tree.as.IParameterNode;
public class DefinePropertyFunctionEmitter extends JSSubEmitter implements
ISubEmitter<IAccessorNode>
{
public DefinePropertyFunctionEmitter(IJSEmitter emitter)
{
super(emitter);
}
@Override
public void emit(IAccessorNode node)
{
// TODO (mschmalle) will remove this cast as more things get abstracted
JSRoyaleEmitter fjs = (JSRoyaleEmitter) getEmitter();
boolean isBindableSetter = false;
if (node instanceof SetterNode)
{
IMetaInfo[] metaInfos = null;
metaInfos = node.getMetaInfos();
for (IMetaInfo metaInfo : metaInfos)
{
String name = metaInfo.getTagName();
if (name.equals("Bindable")
&& metaInfo.getAllAttributes().length == 0)
{
isBindableSetter = true;
break;
}
}
}
if (isBindableSetter)
{
//write(ASEmitterTokens.FUNCTION);
//emitParameters(node.getParametersContainerNode());
write(ASEmitterTokens.SPACE);
writeNewline(ASEmitterTokens.BLOCK_OPEN);
write(ASEmitterTokens.VAR);
write(ASEmitterTokens.SPACE);
write("oldValue");
write(ASEmitterTokens.SPACE);
write(ASEmitterTokens.EQUAL);
write(ASEmitterTokens.SPACE);
write(ASEmitterTokens.THIS);
write(ASEmitterTokens.MEMBER_ACCESS);
write(node.getName());
//write(ASEmitterTokens.PAREN_OPEN);
//write(ASEmitterTokens.PAREN_CLOSE);
writeNewline(ASEmitterTokens.SEMICOLON);
// add change check
write(ASEmitterTokens.IF);
write(ASEmitterTokens.SPACE);
write(ASEmitterTokens.PAREN_OPEN);
write("oldValue");
write(ASEmitterTokens.SPACE);
write(ASEmitterTokens.STRICT_EQUAL);
write(ASEmitterTokens.SPACE);
IParameterNode[] params = node.getParameterNodes();
write(params[0].getName());
write(ASEmitterTokens.PAREN_CLOSE);
write(ASEmitterTokens.SPACE);
write(ASEmitterTokens.RETURN);
writeNewline(ASEmitterTokens.SEMICOLON);
write(ASEmitterTokens.THIS);
write(ASEmitterTokens.MEMBER_ACCESS);
write("__bindingWrappedSetter__" + node.getName());
write(ASEmitterTokens.PAREN_OPEN);
write(params[0].getName());
write(ASEmitterTokens.PAREN_CLOSE);
writeNewline(ASEmitterTokens.SEMICOLON);
// add dispatch of change event
writeNewline(" this.dispatchEvent(org.apache.royale.events.ValueChangeEvent.createUpdateEvent(");
writeNewline(" this, \"" + node.getName()
+ "\", oldValue, " + params[0].getName() + "));");
write(ASEmitterTokens.BLOCK_CLOSE);
//writeNewline(ASEmitterTokens.SEMICOLON);
writeNewline();
writeNewline();
}
else
{
fjs.emitMethodScope(node.getScopedNode());
}
}
}