| /* |
| * |
| * 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()); |
| } |
| } |
| } |