001    // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
002    // for details. All rights reserved. Use of this source code is governed by a
003    // BSD-style license that can be found in the LICENSE file.
004    
005    package com.google.dart.compiler.backend.js.ast;
006    
007    import com.google.dart.compiler.common.Symbol;
008    import com.intellij.util.SmartList;
009    import org.jetbrains.annotations.Nullable;
010    
011    import java.util.List;
012    
013    public final class JsFunction extends JsLiteral implements HasName {
014        private JsBlock body;
015        private List<JsParameter> params;
016        private final JsScope scope;
017        private JsName name;
018    
019        public JsFunction(JsScope parentScope) {
020            this(parentScope, (JsName) null);
021        }
022    
023        public JsFunction(JsScope parentScope, JsBlock body) {
024            this(parentScope, (JsName) null);
025            this.body = body;
026        }
027    
028        private JsFunction(JsScope parentScope, @Nullable JsName name) {
029            this.name = name;
030            scope = new JsScope(parentScope, name == null ? null : name.getIdent());
031        }
032    
033        public JsBlock getBody() {
034            return body;
035        }
036    
037        @Override
038        public JsName getName() {
039            return name;
040        }
041    
042        @Override
043        public Symbol getSymbol() {
044            return name;
045        }
046    
047        public List<JsParameter> getParameters() {
048            if (params == null) {
049                params = new SmartList<JsParameter>();
050            }
051            return params;
052        }
053    
054        public JsScope getScope() {
055            return scope;
056        }
057    
058        public void setBody(JsBlock body) {
059            this.body = body;
060        }
061    
062        public void setName(@Nullable JsName name) {
063            this.name = name;
064        }
065    
066        @Override
067        public void accept(JsVisitor v) {
068            v.visitFunction(this);
069        }
070    
071        @Override
072        public void acceptChildren(JsVisitor visitor) {
073            visitor.acceptWithInsertRemove(params);
074            visitor.accept(body);
075        }
076    }