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.NotNull;
010 import org.jetbrains.annotations.Nullable;
011
012 import java.util.List;
013
014 public final class JsFunction extends JsLiteral implements HasName {
015 @NotNull
016 private JsBlock body;
017 private List<JsParameter> params;
018 @NotNull
019 private final JsFunctionScope scope;
020 private JsName name;
021
022 public JsFunction(@NotNull JsScope parentScope, @NotNull String description) {
023 this(parentScope, description, null);
024 }
025
026 public JsFunction(@NotNull JsScope parentScope, @NotNull JsBlock body, @NotNull String description) {
027 this(parentScope, description, null);
028 this.body = body;
029 }
030
031 private JsFunction(@NotNull JsScope parentScope, @NotNull String description, @Nullable JsName name) {
032 this.name = name;
033 scope = new JsFunctionScope(parentScope, name == null ? description : name.getIdent());
034 }
035
036 @NotNull
037 public JsBlock getBody() {
038 return body;
039 }
040
041 @Override
042 public JsName getName() {
043 return name;
044 }
045
046 @Override
047 public Symbol getSymbol() {
048 return name;
049 }
050
051 @NotNull
052 public List<JsParameter> getParameters() {
053 if (params == null) {
054 params = new SmartList<JsParameter>();
055 }
056 return params;
057 }
058
059 @NotNull
060 public JsFunctionScope getScope() {
061 return scope;
062 }
063
064 public void setBody(@NotNull JsBlock body) {
065 this.body = body;
066 }
067
068 public void setName(@Nullable JsName name) {
069 this.name = name;
070 }
071
072 @Override
073 public void accept(JsVisitor v) {
074 v.visitFunction(this);
075 }
076
077 @Override
078 public void acceptChildren(JsVisitor visitor) {
079 visitor.acceptWithInsertRemove(params);
080 visitor.accept(body);
081 }
082 }