diff --git a/scala/sbt.expected.raydebug b/scala/sbt.expected.raydebug new file mode 100644 index 0000000..fee4890 --- /dev/null +++ b/scala/sbt.expected.raydebug @@ -0,0 +1,637 @@ +comment(/* sbt -- Simple Build Tool + * Copyright 2011 Mark Harrah + */) +keyword(package) ident(sbt) + +keyword(import) ident(Types)operator(.)ident(_) + +keyword(sealed) keyword(trait) class(Settings)operator([)ident(Scope)operator(]) operator({) + keyword(def) ident(data)operator(:) predefined_type(Map)operator([)ident(Scope)operator(,) ident(AttributeMap)operator(]) + keyword(def) ident(keys)operator(()ident(scope)operator(:) ident(Scope)operator(\))operator(:) predefined_type(Set)operator([)ident(AttributeKey)operator([)ident(_)operator(])operator(]) + keyword(def) ident(scopes)operator(:) predefined_type(Set)operator([)ident(Scope)operator(]) + keyword(def) ident(definingScope)operator(()ident(scope)operator(:) ident(Scope)operator(,) ident(key)operator(:) ident(AttributeKey)operator([)ident(_)operator(])operator(\))operator(:) predefined_type(Option)operator([)ident(Scope)operator(]) + keyword(def) ident(allKeys)operator([)ident(T)operator(])operator(()ident(f)operator(:) operator(()ident(Scope)operator(,) ident(AttributeKey)operator([)ident(_)operator(])operator(\)) operator(=)operator(>) ident(T)operator(\))operator(:) predefined_type(Seq)operator([)ident(T)operator(]) + keyword(def) ident(get)operator([)ident(T)operator(])operator(()ident(scope)operator(:) ident(Scope)operator(,) ident(key)operator(:) ident(AttributeKey)operator([)ident(T)operator(])operator(\))operator(:) predefined_type(Option)operator([)ident(T)operator(]) + keyword(def) ident(getDirect)operator([)ident(T)operator(])operator(()ident(scope)operator(:) ident(Scope)operator(,) ident(key)operator(:) ident(AttributeKey)operator([)ident(T)operator(])operator(\))operator(:) predefined_type(Option)operator([)ident(T)operator(]) + keyword(def) ident(set)operator([)ident(T)operator(])operator(()ident(scope)operator(:) ident(Scope)operator(,) ident(key)operator(:) ident(AttributeKey)operator([)ident(T)operator(])operator(,) ident(value)operator(:) ident(T)operator(\))operator(:) ident(Settings)operator([)ident(Scope)operator(]) +operator(}) + +directive(private) directive(final) type(class) class(Settings0)operator([)ident(Scope)operator(])operator(()keyword(val) ident(data)operator(:) predefined_type(Map)operator([)ident(Scope)operator(,) ident(AttributeMap)operator(])operator(,) keyword(val) ident(delegates)operator(:) ident(Scope) operator(=)operator(>) predefined_type(Seq)operator([)ident(Scope)operator(])operator(\)) directive(extends) ident(Settings)operator([)ident(Scope)operator(]) operator({) + keyword(def) ident(scopes)operator(:) predefined_type(Set)operator([)ident(Scope)operator(]) operator(=) ident(data)operator(.)ident(keySet)operator(.)ident(toSet) + keyword(def) ident(keys)operator(()ident(scope)operator(:) ident(Scope)operator(\)) operator(=) ident(data)operator(()ident(scope)operator(\))operator(.)ident(keys)operator(.)ident(toSet) + keyword(def) ident(allKeys)operator([)ident(T)operator(])operator(()ident(f)operator(:) operator(()ident(Scope)operator(,) ident(AttributeKey)operator([)ident(_)operator(])operator(\)) operator(=)operator(>) ident(T)operator(\))operator(:) predefined_type(Seq)operator([)ident(T)operator(]) operator(=) ident(data)operator(.)ident(flatMap) operator({) keyword(case) operator(()ident(scope)operator(,) ident(map)operator(\)) operator(=)operator(>) ident(map)operator(.)ident(keys)operator(.)ident(map)operator(()ident(k) operator(=)operator(>) ident(f)operator(()ident(scope)operator(,) ident(k)operator(\))operator(\)) operator(}) ident(toSeq)operator(;) + + keyword(def) ident(get)operator([)ident(T)operator(])operator(()ident(scope)operator(:) ident(Scope)operator(,) ident(key)operator(:) ident(AttributeKey)operator([)ident(T)operator(])operator(\))operator(:) predefined_type(Option)operator([)ident(T)operator(]) operator(=) + ident(delegates)operator(()ident(scope)operator(\))operator(.)ident(toStream)operator(.)ident(flatMap)operator(()ident(sc) operator(=)operator(>) ident(getDirect)operator(()ident(sc)operator(,) ident(key)operator(\))operator(\))operator(.)ident(headOption) + keyword(def) ident(definingScope)operator(()ident(scope)operator(:) ident(Scope)operator(,) ident(key)operator(:) ident(AttributeKey)operator([)ident(_)operator(])operator(\))operator(:) predefined_type(Option)operator([)ident(Scope)operator(]) operator(=) + ident(delegates)operator(()ident(scope)operator(\))operator(.)ident(toStream)operator(.)ident(filter)operator(()ident(sc) operator(=)operator(>) ident(getDirect)operator(()ident(sc)operator(,) ident(key)operator(\))operator(.)ident(isDefined)operator(\))operator(.)ident(headOption) + + keyword(def) ident(getDirect)operator([)ident(T)operator(])operator(()ident(scope)operator(:) ident(Scope)operator(,) ident(key)operator(:) ident(AttributeKey)operator([)ident(T)operator(])operator(\))operator(:) predefined_type(Option)operator([)ident(T)operator(]) operator(=) + operator(()ident(data) ident(get) ident(scope)operator(\))operator(.)ident(flatMap)operator(()ident(_) ident(get) ident(key)operator(\)) + + keyword(def) ident(set)operator([)ident(T)operator(])operator(()ident(scope)operator(:) ident(Scope)operator(,) ident(key)operator(:) ident(AttributeKey)operator([)ident(T)operator(])operator(,) ident(value)operator(:) ident(T)operator(\))operator(:) ident(Settings)operator([)ident(Scope)operator(]) operator(=) + operator({) + keyword(val) ident(map) operator(=) operator(()ident(data) ident(get) ident(scope)operator(\)) ident(getOrElse) ident(AttributeMap)operator(.)ident(empty) + keyword(val) ident(newData) operator(=) ident(data)operator(.)ident(updated)operator(()ident(scope)operator(,) ident(map)operator(.)ident(put)operator(()ident(key)operator(,) ident(value)operator(\))operator(\)) + keyword(new) ident(Settings0)operator(()ident(newData)operator(,) ident(delegates)operator(\)) + operator(}) +operator(}) +comment(// delegates should contain the input Scope as the first entry) +comment(// this trait is intended to be mixed into an object) +keyword(trait) class(Init)operator([)ident(Scope)operator(]) operator({) + comment(/** The Show instance used when a detailed String needs to be generated. It is typically used when no context is available.*/) + keyword(def) ident(showFullKey)operator(:) ident(Show)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(]) + + directive(final) keyword(case) type(class) class(ScopedKey)operator([)ident(T)operator(])operator(()ident(scope)operator(:) ident(Scope)operator(,) ident(key)operator(:) ident(AttributeKey)operator([)ident(T)operator(])operator(\)) directive(extends) ident(KeyedInitialize)operator([)ident(T)operator(]) operator({) + keyword(def) ident(scopedKey) operator(=) local_variable(this) + operator(}) + + keyword(type) ident(SettingSeq)operator([)ident(T)operator(]) operator(=) predefined_type(Seq)operator([)ident(Setting)operator([)ident(T)operator(])operator(]) + keyword(type) ident(ScopedMap) operator(=) ident(IMap)operator([)ident(ScopedKey)operator(,) ident(SettingSeq)operator(]) + keyword(type) ident(CompiledMap) operator(=) predefined_type(Map)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(,) ident(Compiled)operator([)ident(_)operator(])operator(]) + keyword(type) ident(MapScoped) operator(=) ident(ScopedKey) operator(~)operator(>) ident(ScopedKey) + keyword(type) ident(ValidatedRef)operator([)ident(T)operator(]) operator(=) predefined_type(Either)operator([)ident(Undefined)operator(,) ident(ScopedKey)operator([)ident(T)operator(])operator(]) + keyword(type) ident(ValidatedInit)operator([)ident(T)operator(]) operator(=) predefined_type(Either)operator([)predefined_type(Seq)operator([)ident(Undefined)operator(])operator(,) ident(Initialize)operator([)ident(T)operator(])operator(]) + keyword(type) ident(ValidateRef) operator(=) ident(ScopedKey) operator(~)operator(>) ident(ValidatedRef) + keyword(type) ident(ScopeLocal) operator(=) ident(ScopedKey)operator([)ident(_)operator(]) operator(=)operator(>) predefined_type(Seq)operator([)ident(Setting)operator([)ident(_)operator(])operator(]) + keyword(type) ident(MapConstant) operator(=) ident(ScopedKey) operator(~)operator(>) predefined_type(Option) + + directive(private)operator([)ident(sbt)operator(]) directive(abstract) type(class) class(ValidateKeyRef) operator({) + keyword(def) ident(apply)operator([)ident(T)operator(])operator(()ident(key)operator(:) ident(ScopedKey)operator([)ident(T)operator(])operator(,) ident(selfRefOk)operator(:) predefined_type(Boolean)operator(\))operator(:) ident(ValidatedRef)operator([)ident(T)operator(]) + operator(}) + + comment(/** + * The result of this initialization is the composition of applied transformations. + * This can be useful when dealing with dynamic Initialize values. + */) + keyword(lazy) keyword(val) ident(capturedTransformations)operator(:) ident(Initialize)operator([)ident(Initialize) operator(~)operator(>) ident(Initialize)operator(]) operator(=) keyword(new) ident(TransformCapture)operator(()ident(idK)operator([)ident(Initialize)operator(])operator(\)) + + keyword(def) ident(setting)operator([)ident(T)operator(])operator(()ident(key)operator(:) ident(ScopedKey)operator([)ident(T)operator(])operator(,) ident(init)operator(:) ident(Initialize)operator([)ident(T)operator(])operator(,) ident(pos)operator(:) ident(SourcePosition) operator(=) ident(NoPosition)operator(\))operator(:) ident(Setting)operator([)ident(T)operator(]) operator(=) keyword(new) ident(Setting)operator([)ident(T)operator(])operator(()ident(key)operator(,) ident(init)operator(,) ident(pos)operator(\)) + keyword(def) ident(valueStrict)operator([)ident(T)operator(])operator(()ident(value)operator(:) ident(T)operator(\))operator(:) ident(Initialize)operator([)ident(T)operator(]) operator(=) ident(pure)operator(()operator(()operator(\)) operator(=)operator(>) ident(value)operator(\)) + keyword(def) ident(value)operator([)ident(T)operator(])operator(()ident(value)operator(:) operator(=)operator(>) ident(T)operator(\))operator(:) ident(Initialize)operator([)ident(T)operator(]) operator(=) ident(pure)operator(()ident(value) ident(_)operator(\)) + keyword(def) ident(pure)operator([)ident(T)operator(])operator(()ident(value)operator(:) operator(()operator(\)) operator(=)operator(>) ident(T)operator(\))operator(:) ident(Initialize)operator([)ident(T)operator(]) operator(=) keyword(new) ident(Value)operator(()ident(value)operator(\)) + keyword(def) ident(optional)operator([)ident(T)operator(,) ident(U)operator(])operator(()ident(i)operator(:) ident(Initialize)operator([)ident(T)operator(])operator(\))operator(()ident(f)operator(:) predefined_type(Option)operator([)ident(T)operator(]) operator(=)operator(>) ident(U)operator(\))operator(:) ident(Initialize)operator([)ident(U)operator(]) operator(=) keyword(new) ident(Optional)operator(()predefined_type(Some)operator(()ident(i)operator(\))operator(,) ident(f)operator(\)) + keyword(def) ident(update)operator([)ident(T)operator(])operator(()ident(key)operator(:) ident(ScopedKey)operator([)ident(T)operator(])operator(\))operator(()ident(f)operator(:) ident(T) operator(=)operator(>) ident(T)operator(\))operator(:) ident(Setting)operator([)ident(T)operator(]) operator(=) ident(setting)operator([)ident(T)operator(])operator(()ident(key)operator(,) ident(map)operator(()ident(key)operator(\))operator(()ident(f)operator(\))operator(,) ident(NoPosition)operator(\)) + keyword(def) ident(bind)operator([)ident(S)operator(,) ident(T)operator(])operator(()ident(in)operator(:) ident(Initialize)operator([)ident(S)operator(])operator(\))operator(()ident(f)operator(:) ident(S) operator(=)operator(>) ident(Initialize)operator([)ident(T)operator(])operator(\))operator(:) ident(Initialize)operator([)ident(T)operator(]) operator(=) keyword(new) ident(Bind)operator(()ident(f)operator(,) ident(in)operator(\)) + keyword(def) ident(map)operator([)ident(S)operator(,) ident(T)operator(])operator(()ident(in)operator(:) ident(Initialize)operator([)ident(S)operator(])operator(\))operator(()ident(f)operator(:) ident(S) operator(=)operator(>) ident(T)operator(\))operator(:) ident(Initialize)operator([)ident(T)operator(]) operator(=) keyword(new) ident(Apply)operator([)operator(()operator({) keyword(type) ident(l)operator([)ident(L)operator([)ident(x)operator(])operator(]) operator(=) ident(L)operator([)ident(S)operator(]) operator(})operator(\))error(#)ident(l)operator(,) ident(T)operator(])operator(()ident(f)operator(,) ident(in)operator(,) ident(AList)operator(.)ident(single)operator([)ident(S)operator(])operator(\)) + keyword(def) ident(app)operator([)ident(K)operator([)ident(L)operator([)ident(x)operator(])operator(])operator(,) ident(T)operator(])operator(()ident(inputs)operator(:) ident(K)operator([)ident(Initialize)operator(])operator(\))operator(()ident(f)operator(:) ident(K)operator([)ident(Id)operator(]) operator(=)operator(>) ident(T)operator(\))operator(()keyword(implicit) ident(alist)operator(:) ident(AList)operator([)ident(K)operator(])operator(\))operator(:) ident(Initialize)operator([)ident(T)operator(]) operator(=) keyword(new) ident(Apply)operator([)ident(K)operator(,) ident(T)operator(])operator(()ident(f)operator(,) ident(inputs)operator(,) ident(alist)operator(\)) + keyword(def) ident(uniform)operator([)ident(S)operator(,) ident(T)operator(])operator(()ident(inputs)operator(:) predefined_type(Seq)operator([)ident(Initialize)operator([)ident(S)operator(])operator(])operator(\))operator(()ident(f)operator(:) predefined_type(Seq)operator([)ident(S)operator(]) operator(=)operator(>) ident(T)operator(\))operator(:) ident(Initialize)operator([)ident(T)operator(]) operator(=) + keyword(new) ident(Apply)operator([)operator(()operator({) keyword(type) ident(l)operator([)ident(L)operator([)ident(x)operator(])operator(]) operator(=) predefined_type(List)operator([)ident(L)operator([)ident(S)operator(])operator(]) operator(})operator(\))error(#)ident(l)operator(,) ident(T)operator(])operator(()ident(f)operator(,) ident(inputs)operator(.)ident(toList)operator(,) ident(AList)operator(.)ident(seq)operator([)ident(S)operator(])operator(\)) + + comment(/** + * The result of this initialization is the validated `key`. + * No dependency is introduced on `key`. If `selfRefOk` is true, validation will not fail if the key is referenced by a definition of `key`. + * That is, key := f(validated(key\).value\) is allowed only if `selfRefOk == true`. + */) + directive(private)operator([)ident(sbt)operator(]) directive(final) keyword(def) ident(validated)operator([)ident(T)operator(])operator(()ident(key)operator(:) ident(ScopedKey)operator([)ident(T)operator(])operator(,) ident(selfRefOk)operator(:) predefined_type(Boolean)operator(\))operator(:) ident(ValidationCapture)operator([)ident(T)operator(]) operator(=) keyword(new) ident(ValidationCapture)operator(()ident(key)operator(,) ident(selfRefOk)operator(\)) + + annotation(@deprecated)operator(()stringoperator(,) stringoperator(\)) + directive(final) keyword(def) ident(derive)operator([)ident(T)operator(])operator(()ident(s)operator(:) ident(Setting)operator([)ident(T)operator(])operator(,) ident(allowDynamic)operator(:) predefined_type(Boolean)operator(,) ident(filter)operator(:) ident(Scope) operator(=)operator(>) predefined_type(Boolean)operator(,) ident(trigger)operator(:) ident(AttributeKey)operator([)ident(_)operator(]) operator(=)operator(>) predefined_type(Boolean)operator(\))operator(:) ident(Setting)operator([)ident(T)operator(]) operator(=) + ident(derive)operator(()ident(s)operator(,) ident(allowDynamic)operator(,) ident(filter)operator(,) ident(trigger)operator(,) predefined_constant(false)operator(\)) + comment(/** + * Constructs a derived setting that will be automatically defined in every scope where one of its dependencies + * is explicitly defined and the where the scope matches `filter`. + * A setting initialized with dynamic dependencies is only allowed if `allowDynamic` is true. + * Only the static dependencies are tracked, however. Dependencies on previous values do not introduce a derived setting either. + */) + directive(final) keyword(def) ident(derive)operator([)ident(T)operator(])operator(()ident(s)operator(:) ident(Setting)operator([)ident(T)operator(])operator(,) ident(allowDynamic)operator(:) predefined_type(Boolean) operator(=) predefined_constant(false)operator(,) ident(filter)operator(:) ident(Scope) operator(=)operator(>) predefined_type(Boolean) operator(=) reserved(const)operator(()predefined_constant(true)operator(\))operator(,) ident(trigger)operator(:) ident(AttributeKey)operator([)ident(_)operator(]) operator(=)operator(>) predefined_type(Boolean) operator(=) reserved(const)operator(()predefined_constant(true)operator(\))operator(,) ident(default)operator(:) predefined_type(Boolean) operator(=) predefined_constant(false)operator(\))operator(:) ident(Setting)operator([)ident(T)operator(]) operator(=) operator({) + ident(deriveAllowed)operator(()ident(s)operator(,) ident(allowDynamic)operator(\)) ident(foreach) ident(sys)operator(.)ident(error) + keyword(val) ident(d) operator(=) keyword(new) ident(DerivedSetting)operator([)ident(T)operator(])operator(()ident(s)operator(.)ident(key)operator(,) ident(s)operator(.)ident(init)operator(,) ident(s)operator(.)ident(pos)operator(,) ident(filter)operator(,) ident(trigger)operator(\)) + keyword(if) operator(()ident(default)operator(\)) ident(d)operator(.)ident(default)operator(()operator(\)) keyword(else) ident(d) + operator(}) + keyword(def) ident(deriveAllowed)operator([)ident(T)operator(])operator(()ident(s)operator(:) ident(Setting)operator([)ident(T)operator(])operator(,) ident(allowDynamic)operator(:) predefined_type(Boolean)operator(\))operator(:) predefined_type(Option)operator([)ident(String)operator(]) operator(=) ident(s)operator(.)ident(init) keyword(match) operator({) + keyword(case) ident(_)operator(:) ident(Bind)operator([)ident(_)operator(,) ident(_)operator(]) keyword(if) operator(!)ident(allowDynamic) operator(=)operator(>) predefined_type(Some)operator(()stringoperator(\)) + keyword(case) ident(_) operator(=)operator(>) predefined_type(None) + operator(}) + comment(// id is used for equality) + directive(private)operator([)ident(sbt)operator(]) directive(final) keyword(def) ident(defaultSetting)operator([)ident(T)operator(])operator(()ident(s)operator(:) ident(Setting)operator([)ident(T)operator(])operator(\))operator(:) ident(Setting)operator([)ident(T)operator(]) operator(=) ident(s)operator(.)ident(default)operator(()operator(\)) + directive(private)operator([)ident(sbt)operator(]) keyword(def) ident(defaultSettings)operator(()ident(ss)operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(_)operator(])operator(])operator(\))operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(_)operator(])operator(]) operator(=) ident(ss)operator(.)ident(map)operator(()ident(s) operator(=)operator(>) ident(defaultSetting)operator(()ident(s)operator(\))operator(\)) + directive(private)operator([)local_variable(this)operator(]) directive(final) keyword(val) ident(nextID) operator(=) keyword(new) ident(java)operator(.)ident(util)operator(.)ident(concurrent)operator(.)ident(atomic)operator(.)ident(AtomicLong) + directive(private)operator([)local_variable(this)operator(]) directive(final) keyword(def) ident(nextDefaultID)operator(()operator(\))operator(:) predefined_type(Long) operator(=) ident(nextID)operator(.)ident(incrementAndGet)operator(()operator(\)) + + keyword(def) ident(empty)operator(()keyword(implicit) ident(delegates)operator(:) ident(Scope) operator(=)operator(>) predefined_type(Seq)operator([)ident(Scope)operator(])operator(\))operator(:) ident(Settings)operator([)ident(Scope)operator(]) operator(=) keyword(new) ident(Settings0)operator(()predefined_type(Map)operator(.)ident(empty)operator(,) ident(delegates)operator(\)) + keyword(def) ident(asTransform)operator(()ident(s)operator(:) ident(Settings)operator([)ident(Scope)operator(])operator(\))operator(:) ident(ScopedKey) operator(~)operator(>) ident(Id) operator(=) keyword(new) operator(()ident(ScopedKey) operator(~)operator(>) ident(Id)operator(\)) operator({) + keyword(def) ident(apply)operator([)ident(T)operator(])operator(()ident(k)operator(:) ident(ScopedKey)operator([)ident(T)operator(])operator(\))operator(:) ident(T) operator(=) ident(getValue)operator(()ident(s)operator(,) ident(k)operator(\)) + operator(}) + keyword(def) ident(getValue)operator([)ident(T)operator(])operator(()ident(s)operator(:) ident(Settings)operator([)ident(Scope)operator(])operator(,) ident(k)operator(:) ident(ScopedKey)operator([)ident(T)operator(])operator(\)) operator(=) ident(s)operator(.)ident(get)operator(()ident(k)operator(.)ident(scope)operator(,) ident(k)operator(.)ident(key)operator(\)) ident(getOrElse) operator(()keyword(throw) keyword(new) ident(InvalidReference)operator(()ident(k)operator(\))operator(\)) + keyword(def) ident(asFunction)operator([)ident(T)operator(])operator(()ident(s)operator(:) ident(Settings)operator([)ident(Scope)operator(])operator(\))operator(:) ident(ScopedKey)operator([)ident(T)operator(]) operator(=)operator(>) ident(T) operator(=) ident(k) operator(=)operator(>) ident(getValue)operator(()ident(s)operator(,) ident(k)operator(\)) + keyword(def) ident(mapScope)operator(()ident(f)operator(:) ident(Scope) operator(=)operator(>) ident(Scope)operator(\))operator(:) ident(MapScoped) operator(=) keyword(new) ident(MapScoped) operator({) + keyword(def) ident(apply)operator([)ident(T)operator(])operator(()ident(k)operator(:) ident(ScopedKey)operator([)ident(T)operator(])operator(\))operator(:) ident(ScopedKey)operator([)ident(T)operator(]) operator(=) ident(k)operator(.)ident(copy)operator(()ident(scope) operator(=) ident(f)operator(()ident(k)operator(.)ident(scope)operator(\))operator(\)) + operator(}) + directive(private) directive(final) type(class) class(InvalidReference)operator(()keyword(val) ident(key)operator(:) ident(ScopedKey)operator([)ident(_)operator(])operator(\)) directive(extends) ident(RuntimeException)operator(()string operator(+) ident(showFullKey)operator(()ident(key)operator(\))operator(\)) + + directive(private)operator([)local_variable(this)operator(]) keyword(def) ident(applyDefaults)operator(()ident(ss)operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(_)operator(])operator(])operator(\))operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(_)operator(])operator(]) operator(=) + operator({) + keyword(val) operator(()ident(defaults)operator(,) ident(others)operator(\)) operator(=) ident(Util)operator(.)ident(separate)operator([)ident(Setting)operator([)ident(_)operator(])operator(,) ident(DefaultSetting)operator([)ident(_)operator(])operator(,) ident(Setting)operator([)ident(_)operator(])operator(])operator(()ident(ss)operator(\)) operator({) keyword(case) ident(u)operator(:) ident(DefaultSetting)operator([)ident(_)operator(]) operator(=)operator(>) predefined_type(Left)operator(()ident(u)operator(\))operator(;) keyword(case) ident(s) operator(=)operator(>) predefined_type(Right)operator(()ident(s)operator(\)) operator(}) + ident(defaults)operator(.)ident(distinct) operator(++) ident(others) + operator(}) + + keyword(def) ident(compiled)operator(()ident(init)operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(_)operator(])operator(])operator(,) ident(actual)operator(:) predefined_type(Boolean) operator(=) predefined_constant(true)operator(\))operator(()keyword(implicit) ident(delegates)operator(:) ident(Scope) operator(=)operator(>) predefined_type(Seq)operator([)ident(Scope)operator(])operator(,) ident(scopeLocal)operator(:) ident(ScopeLocal)operator(,) ident(display)operator(:) ident(Show)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(])operator(\))operator(:) ident(CompiledMap) operator(=) + operator({) + keyword(val) ident(initDefaults) operator(=) ident(applyDefaults)operator(()ident(init)operator(\)) + comment(// inject derived settings into scopes where their dependencies are directly defined) + comment(// and prepend per-scope settings) + keyword(val) ident(derived) operator(=) ident(deriveAndLocal)operator(()ident(initDefaults)operator(\)) + comment(// group by Scope/Key, dropping dead initializations) + keyword(val) ident(sMap)operator(:) ident(ScopedMap) operator(=) ident(grouped)operator(()ident(derived)operator(\)) + comment(// delegate references to undefined values according to 'delegates') + keyword(val) ident(dMap)operator(:) ident(ScopedMap) operator(=) keyword(if) operator(()ident(actual)operator(\)) ident(delegate)operator(()ident(sMap)operator(\))operator(()ident(delegates)operator(,) ident(display)operator(\)) keyword(else) ident(sMap) + comment(// merge Seq[Setting[_]] into Compiled) + ident(compile)operator(()ident(dMap)operator(\)) + operator(}) + keyword(def) ident(make)operator(()ident(init)operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(_)operator(])operator(])operator(\))operator(()keyword(implicit) ident(delegates)operator(:) ident(Scope) operator(=)operator(>) predefined_type(Seq)operator([)ident(Scope)operator(])operator(,) ident(scopeLocal)operator(:) ident(ScopeLocal)operator(,) ident(display)operator(:) ident(Show)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(])operator(\))operator(:) ident(Settings)operator([)ident(Scope)operator(]) operator(=) + operator({) + keyword(val) ident(cMap) operator(=) ident(compiled)operator(()ident(init)operator(\))operator(()ident(delegates)operator(,) ident(scopeLocal)operator(,) ident(display)operator(\)) + comment(// order the initializations. cyclic references are detected here.) + keyword(val) ident(ordered)operator(:) predefined_type(Seq)operator([)ident(Compiled)operator([)ident(_)operator(])operator(]) operator(=) ident(sort)operator(()ident(cMap)operator(\)) + comment(// evaluation: apply the initializations.) + keyword(try) operator({) ident(applyInits)operator(()ident(ordered)operator(\)) operator(}) + keyword(catch) operator({) keyword(case) ident(rru)operator(:) ident(RuntimeUndefined) operator(=)operator(>) keyword(throw) ident(Uninitialized)operator(()ident(cMap)operator(.)ident(keys)operator(.)ident(toSeq)operator(,) ident(delegates)operator(,) ident(rru)operator(.)ident(undefined)operator(,) predefined_constant(true)operator(\)) operator(}) + operator(}) + keyword(def) ident(sort)operator(()ident(cMap)operator(:) ident(CompiledMap)operator(\))operator(:) predefined_type(Seq)operator([)ident(Compiled)operator([)ident(_)operator(])operator(]) operator(=) + ident(Dag)operator(.)ident(topologicalSort)operator(()ident(cMap)operator(.)ident(values)operator(\))operator(()ident(_)operator(.)ident(dependencies)operator(.)ident(map)operator(()ident(cMap)operator(\))operator(\)) + + keyword(def) ident(compile)operator(()ident(sMap)operator(:) ident(ScopedMap)operator(\))operator(:) ident(CompiledMap) operator(=) + ident(sMap)operator(.)ident(toTypedSeq)operator(.)ident(map) operator({) + keyword(case) ident(sMap)operator(.)ident(TPair)operator(()ident(k)operator(,) ident(ss)operator(\)) operator(=)operator(>) + keyword(val) ident(deps) operator(=) ident(ss) ident(flatMap) operator({) ident(_)operator(.)ident(dependencies) operator(}) ident(toSet)operator(;) + operator(()ident(k)operator(,) keyword(new) ident(Compiled)operator(()ident(k)operator(,) ident(deps)operator(,) ident(ss)operator(\))operator(\)) + operator(}) ident(toMap)operator(;) + + keyword(def) ident(grouped)operator(()ident(init)operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(_)operator(])operator(])operator(\))operator(:) ident(ScopedMap) operator(=) + operator(()operator(()ident(IMap)operator(.)ident(empty)operator(:) ident(ScopedMap)operator(\)) operator(/)operator(:) ident(init)operator(\))operator(()operator(()ident(m)operator(,) ident(s)operator(\)) operator(=)operator(>) ident(add)operator(()ident(m)operator(,) ident(s)operator(\))operator(\)) + + keyword(def) ident(add)operator([)ident(T)operator(])operator(()ident(m)operator(:) ident(ScopedMap)operator(,) ident(s)operator(:) ident(Setting)operator([)ident(T)operator(])operator(\))operator(:) ident(ScopedMap) operator(=) + ident(m)operator(.)ident(mapValue)operator([)ident(T)operator(])operator(()ident(s)operator(.)ident(key)operator(,) predefined_type(Nil)operator(,) ident(ss) operator(=)operator(>) ident(append)operator(()ident(ss)operator(,) ident(s)operator(\))operator(\)) + + keyword(def) ident(append)operator([)ident(T)operator(])operator(()ident(ss)operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(T)operator(])operator(])operator(,) ident(s)operator(:) ident(Setting)operator([)ident(T)operator(])operator(\))operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(T)operator(])operator(]) operator(=) + keyword(if) operator(()ident(s)operator(.)ident(definitive)operator(\)) ident(s) operator(:)operator(:) predefined_type(Nil) keyword(else) ident(ss) operator(:)operator(+) ident(s) + + keyword(def) ident(addLocal)operator(()ident(init)operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(_)operator(])operator(])operator(\))operator(()keyword(implicit) ident(scopeLocal)operator(:) ident(ScopeLocal)operator(\))operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(_)operator(])operator(]) operator(=) + ident(init)operator(.)ident(flatMap)operator(()ident(_)operator(.)ident(dependencies) ident(flatMap) ident(scopeLocal)operator(\)) operator(++) ident(init) + + keyword(def) ident(delegate)operator(()ident(sMap)operator(:) ident(ScopedMap)operator(\))operator(()keyword(implicit) ident(delegates)operator(:) ident(Scope) operator(=)operator(>) predefined_type(Seq)operator([)ident(Scope)operator(])operator(,) ident(display)operator(:) ident(Show)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(])operator(\))operator(:) ident(ScopedMap) operator(=) + operator({) + keyword(def) ident(refMap)operator(()ident(ref)operator(:) ident(Setting)operator([)ident(_)operator(])operator(,) ident(isFirst)operator(:) predefined_type(Boolean)operator(\)) operator(=) keyword(new) ident(ValidateKeyRef) operator({) + keyword(def) ident(apply)operator([)ident(T)operator(])operator(()ident(k)operator(:) ident(ScopedKey)operator([)ident(T)operator(])operator(,) ident(selfRefOk)operator(:) predefined_type(Boolean)operator(\)) operator(=) + ident(delegateForKey)operator(()ident(sMap)operator(,) ident(k)operator(,) ident(delegates)operator(()ident(k)operator(.)ident(scope)operator(\))operator(,) ident(ref)operator(,) ident(selfRefOk) operator(||) operator(!)ident(isFirst)operator(\)) + operator(}) + keyword(type) ident(ValidatedSettings)operator([)ident(T)operator(]) operator(=) predefined_type(Either)operator([)predefined_type(Seq)operator([)ident(Undefined)operator(])operator(,) ident(SettingSeq)operator([)ident(T)operator(])operator(]) + keyword(val) ident(f) operator(=) keyword(new) operator(()ident(SettingSeq) operator(~)operator(>) ident(ValidatedSettings)operator(\)) operator({) + keyword(def) ident(apply)operator([)ident(T)operator(])operator(()ident(ks)operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(T)operator(])operator(])operator(\)) operator(=) operator({) + keyword(val) operator(()ident(undefs)operator(,) ident(valid)operator(\)) operator(=) ident(Util)operator(.)ident(separate)operator(()ident(ks)operator(.)ident(zipWithIndex)operator(\)) operator({) keyword(case) operator(()ident(s)operator(,) ident(i)operator(\)) operator(=)operator(>) ident(s) ident(validateKeyReferenced) ident(refMap)operator(()ident(s)operator(,) ident(i) operator(==) integer(0)operator(\)) operator(}) + keyword(if) operator(()ident(undefs)operator(.)ident(isEmpty)operator(\)) predefined_type(Right)operator(()ident(valid)operator(\)) keyword(else) predefined_type(Left)operator(()ident(undefs)operator(.)ident(flatten)operator(\)) + operator(}) + operator(}) + keyword(type) ident(Undefs)operator([)ident(_)operator(]) operator(=) predefined_type(Seq)operator([)ident(Undefined)operator(]) + keyword(val) operator(()ident(undefineds)operator(,) ident(result)operator(\)) operator(=) ident(sMap)operator(.)ident(mapSeparate)operator([)ident(Undefs)operator(,) ident(SettingSeq)operator(])operator(()ident(f)operator(\)) + keyword(if) operator(()ident(undefineds)operator(.)ident(isEmpty)operator(\)) + ident(result) + keyword(else) + keyword(throw) ident(Uninitialized)operator(()ident(sMap)operator(.)ident(keys)operator(.)ident(toSeq)operator(,) ident(delegates)operator(,) ident(undefineds)operator(.)ident(values)operator(.)ident(flatten)operator(.)ident(toList)operator(,) predefined_constant(false)operator(\)) + operator(}) + directive(private)operator([)local_variable(this)operator(]) keyword(def) ident(delegateForKey)operator([)ident(T)operator(])operator(()ident(sMap)operator(:) ident(ScopedMap)operator(,) ident(k)operator(:) ident(ScopedKey)operator([)ident(T)operator(])operator(,) ident(scopes)operator(:) predefined_type(Seq)operator([)ident(Scope)operator(])operator(,) ident(ref)operator(:) ident(Setting)operator([)ident(_)operator(])operator(,) ident(selfRefOk)operator(:) predefined_type(Boolean)operator(\))operator(:) predefined_type(Either)operator([)ident(Undefined)operator(,) ident(ScopedKey)operator([)ident(T)operator(])operator(]) operator(=) + operator({) + keyword(val) ident(skeys) operator(=) ident(scopes)operator(.)ident(iterator)operator(.)ident(map)operator(()ident(x) operator(=)operator(>) ident(ScopedKey)operator(()ident(x)operator(,) ident(k)operator(.)ident(key)operator(\))operator(\)) + keyword(val) ident(definedAt) operator(=) ident(skeys)operator(.)ident(find)operator(()ident(sk) operator(=)operator(>) operator(()ident(selfRefOk) operator(||) ident(ref)operator(.)ident(key) operator(!=) ident(sk)operator(\)) operator(&&) operator(()ident(sMap) ident(contains) ident(sk)operator(\))operator(\)) + ident(definedAt)operator(.)ident(toRight)operator(()ident(Undefined)operator(()ident(ref)operator(,) ident(k)operator(\))operator(\)) + operator(}) + + directive(private)operator([)local_variable(this)operator(]) keyword(def) ident(applyInits)operator(()ident(ordered)operator(:) predefined_type(Seq)operator([)ident(Compiled)operator([)ident(_)operator(])operator(])operator(\))operator(()keyword(implicit) ident(delegates)operator(:) ident(Scope) operator(=)operator(>) predefined_type(Seq)operator([)ident(Scope)operator(])operator(\))operator(:) ident(Settings)operator([)ident(Scope)operator(]) operator(=) + operator({) + keyword(val) ident(x) operator(=) ident(java)operator(.)ident(util)operator(.)ident(concurrent)operator(.)ident(Executors)operator(.)ident(newFixedThreadPool)operator(()ident(Runtime)operator(.)ident(getRuntime)operator(.)ident(availableProcessors)operator(\)) + keyword(try) operator({) + keyword(val) ident(eval)operator(:) ident(EvaluateSettings)operator([)ident(Scope)operator(]) operator(=) keyword(new) ident(EvaluateSettings)operator([)ident(Scope)operator(]) operator({) + keyword(override) keyword(val) ident(init)operator(:) ident(Init)operator(.)ident(this)operator(.)ident(type) operator(=) ident(Init)operator(.)ident(this) + keyword(def) ident(compiledSettings) operator(=) ident(ordered) + keyword(def) ident(executor) operator(=) ident(x) + operator(}) + ident(eval)operator(.)ident(run) + operator(}) keyword(finally) operator({) ident(x)operator(.)ident(shutdown)operator(()operator(\)) operator(}) + operator(}) + + keyword(def) ident(showUndefined)operator(()ident(u)operator(:) ident(Undefined)operator(,) ident(validKeys)operator(:) predefined_type(Seq)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(])operator(,) ident(delegates)operator(:) ident(Scope) operator(=)operator(>) predefined_type(Seq)operator([)ident(Scope)operator(])operator(\))operator(()keyword(implicit) ident(display)operator(:) ident(Show)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(])operator(\))operator(:) ident(String) operator(=) + operator({) + keyword(val) ident(guessed) operator(=) ident(guessIntendedScope)operator(()ident(validKeys)operator(,) ident(delegates)operator(,) ident(u)operator(.)ident(referencedKey)operator(\)) + keyword(val) ident(derived) operator(=) ident(u)operator(.)ident(defining)operator(.)ident(isDerived) + keyword(val) ident(refString) operator(=) ident(display)operator(()ident(u)operator(.)ident(defining)operator(.)ident(key)operator(\)) + keyword(val) ident(sourceString) operator(=) keyword(if) operator(()ident(derived)operator(\)) string keyword(else) ident(parenPosString)operator(()ident(u)operator(.)ident(defining)operator(\)) + keyword(val) ident(guessedString) operator(=) keyword(if) operator(()ident(derived)operator(\)) string keyword(else) ident(guessed)operator(.)ident(map)operator(()ident(g) operator(=)operator(>) string operator(+) ident(display)operator(()ident(g)operator(\)) operator(+) stringoperator(\))operator(.)ident(toList)operator(.)ident(mkString) + keyword(val) ident(derivedString) operator(=) keyword(if) operator(()ident(derived)operator(\)) string keyword(else) string + ident(display)operator(()ident(u)operator(.)ident(referencedKey)operator(\)) operator(+) string operator(+) ident(refString) operator(+) ident(sourceString) operator(+) ident(derivedString) operator(+) ident(guessedString) + operator(}) + directive(private)operator([)local_variable(this)operator(]) keyword(def) ident(parenPosString)operator(()ident(s)operator(:) ident(Setting)operator([)ident(_)operator(])operator(\))operator(:) ident(String) operator(=) + ident(s)operator(.)ident(positionString) keyword(match) operator({) keyword(case) predefined_type(None) operator(=)operator(>) stringoperator(;) keyword(case) predefined_type(Some)operator(()ident(s)operator(\)) operator(=)operator(>) string operator(+) ident(s) operator(+) string operator(}) + + keyword(def) ident(guessIntendedScope)operator(()ident(validKeys)operator(:) predefined_type(Seq)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(])operator(,) ident(delegates)operator(:) ident(Scope) operator(=)operator(>) predefined_type(Seq)operator([)ident(Scope)operator(])operator(,) ident(key)operator(:) ident(ScopedKey)operator([)ident(_)operator(])operator(\))operator(:) predefined_type(Option)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(]) operator(=) + operator({) + keyword(val) ident(distances) operator(=) ident(validKeys)operator(.)ident(flatMap) operator({) ident(validKey) operator(=)operator(>) ident(refinedDistance)operator(()ident(delegates)operator(,) ident(validKey)operator(,) ident(key)operator(\))operator(.)ident(map)operator(()ident(dist) operator(=)operator(>) operator(()ident(dist)operator(,) ident(validKey)operator(\))operator(\)) operator(}) + ident(distances)operator(.)ident(sortBy)operator(()ident(_)operator(.)ident(_1)operator(\))operator(.)ident(map)operator(()ident(_)operator(.)ident(_2)operator(\))operator(.)ident(headOption) + operator(}) + keyword(def) ident(refinedDistance)operator(()ident(delegates)operator(:) ident(Scope) operator(=)operator(>) predefined_type(Seq)operator([)ident(Scope)operator(])operator(,) ident(a)operator(:) ident(ScopedKey)operator([)ident(_)operator(])operator(,) ident(b)operator(:) ident(ScopedKey)operator([)ident(_)operator(])operator(\))operator(:) predefined_type(Option)operator([)predefined_type(Int)operator(]) operator(=) + keyword(if) operator(()ident(a)operator(.)ident(key) operator(!=) ident(b)operator(.)ident(key) operator(||) ident(a) operator(==) ident(b)operator(\)) predefined_type(None) + keyword(else) operator({) + keyword(val) ident(dist) operator(=) ident(delegates)operator(()ident(a)operator(.)ident(scope)operator(\))operator(.)ident(indexOf)operator(()ident(b)operator(.)ident(scope)operator(\)) + keyword(if) operator(()ident(dist) operator(<) integer(0)operator(\)) predefined_type(None) keyword(else) predefined_type(Some)operator(()ident(dist)operator(\)) + operator(}) + + directive(final) type(class) class(Uninitialized)operator(()keyword(val) ident(undefined)operator(:) predefined_type(Seq)operator([)ident(Undefined)operator(])operator(,) keyword(override) keyword(val) ident(toString)operator(:) ident(String)operator(\)) directive(extends) exception(Exception)operator(()ident(toString)operator(\)) + directive(final) type(class) class(Undefined) directive(private)operator([)ident(sbt)operator(]) operator(()keyword(val) ident(defining)operator(:) ident(Setting)operator([)ident(_)operator(])operator(,) keyword(val) ident(referencedKey)operator(:) ident(ScopedKey)operator([)ident(_)operator(])operator(\)) operator({) + annotation(@deprecated)operator(()stringoperator(,) stringoperator(\)) + keyword(val) ident(definingKey) operator(=) ident(defining)operator(.)ident(key) + annotation(@deprecated)operator(()stringoperator(,) stringoperator(\)) + keyword(val) ident(derived)operator(:) predefined_type(Boolean) operator(=) ident(defining)operator(.)ident(isDerived) + annotation(@deprecated)operator(()stringoperator(,) stringoperator(\)) + keyword(def) local_variable(this)operator(()ident(definingKey)operator(:) ident(ScopedKey)operator([)ident(_)operator(])operator(,) ident(referencedKey)operator(:) ident(ScopedKey)operator([)ident(_)operator(])operator(,) ident(derived)operator(:) predefined_type(Boolean)operator(\)) operator(=) local_variable(this)operator(()ident(fakeUndefinedSetting)operator(()ident(definingKey)operator(,) ident(derived)operator(\))operator(,) ident(referencedKey)operator(\)) + operator(}) + directive(final) type(class) class(RuntimeUndefined)operator(()keyword(val) ident(undefined)operator(:) predefined_type(Seq)operator([)ident(Undefined)operator(])operator(\)) directive(extends) ident(RuntimeException)operator(()stringoperator(\)) + + annotation(@deprecated)operator(()stringoperator(,) stringoperator(\)) + keyword(def) ident(Undefined)operator(()ident(definingKey)operator(:) ident(ScopedKey)operator([)ident(_)operator(])operator(,) ident(referencedKey)operator(:) ident(ScopedKey)operator([)ident(_)operator(])operator(,) ident(derived)operator(:) predefined_type(Boolean)operator(\))operator(:) ident(Undefined) operator(=) + keyword(new) ident(Undefined)operator(()ident(fakeUndefinedSetting)operator(()ident(definingKey)operator(,) ident(derived)operator(\))operator(,) ident(referencedKey)operator(\)) + directive(private)operator([)local_variable(this)operator(]) keyword(def) ident(fakeUndefinedSetting)operator([)ident(T)operator(])operator(()ident(definingKey)operator(:) ident(ScopedKey)operator([)ident(T)operator(])operator(,) ident(d)operator(:) predefined_type(Boolean)operator(\))operator(:) ident(Setting)operator([)ident(T)operator(]) operator(=) + operator({) + keyword(val) ident(init)operator(:) ident(Initialize)operator([)ident(T)operator(]) operator(=) ident(pure)operator(()operator(()operator(\)) operator(=)operator(>) ident(sys)operator(.)ident(error)operator(()stringoperator(\))operator(\)) + keyword(new) ident(Setting)operator(()ident(definingKey)operator(,) ident(init)operator(,) ident(NoPosition)operator(\)) operator({) keyword(override) keyword(def) ident(isDerived) operator(=) ident(d) operator(}) + operator(}) + + keyword(def) ident(Undefined)operator(()ident(defining)operator(:) ident(Setting)operator([)ident(_)operator(])operator(,) ident(referencedKey)operator(:) ident(ScopedKey)operator([)ident(_)operator(])operator(\))operator(:) ident(Undefined) operator(=) keyword(new) ident(Undefined)operator(()ident(defining)operator(,) ident(referencedKey)operator(\)) + keyword(def) ident(Uninitialized)operator(()ident(validKeys)operator(:) predefined_type(Seq)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(])operator(,) ident(delegates)operator(:) ident(Scope) operator(=)operator(>) predefined_type(Seq)operator([)ident(Scope)operator(])operator(,) ident(keys)operator(:) predefined_type(Seq)operator([)ident(Undefined)operator(])operator(,) ident(runtime)operator(:) predefined_type(Boolean)operator(\))operator(()keyword(implicit) ident(display)operator(:) ident(Show)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(])operator(\))operator(:) ident(Uninitialized) operator(=) + operator({) + ident(assert)operator(()operator(!)ident(keys)operator(.)ident(isEmpty)operator(\)) + keyword(val) ident(suffix) operator(=) keyword(if) operator(()ident(keys)operator(.)ident(length) operator(>) integer(1)operator(\)) string keyword(else) string + keyword(val) ident(prefix) operator(=) keyword(if) operator(()ident(runtime)operator(\)) string keyword(else) string + keyword(val) ident(keysString) operator(=) ident(keys)operator(.)ident(map)operator(()ident(u) operator(=)operator(>) ident(showUndefined)operator(()ident(u)operator(,) ident(validKeys)operator(,) ident(delegates)operator(\))operator(\))operator(.)ident(mkString)operator(()stringoperator(,) stringoperator(,) stringoperator(\)) + keyword(new) ident(Uninitialized)operator(()ident(keys)operator(,) ident(prefix) operator(+) ident(suffix) operator(+) string operator(+) ident(suffix) operator(+) string operator(+) ident(keysString) operator(+) stringoperator(\)) + operator(}) + directive(final) type(class) class(Compiled)operator([)ident(T)operator(])operator(()keyword(val) ident(key)operator(:) ident(ScopedKey)operator([)ident(T)operator(])operator(,) keyword(val) ident(dependencies)operator(:) predefined_type(Iterable)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(])operator(,) keyword(val) ident(settings)operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(T)operator(])operator(])operator(\)) operator({) + keyword(override) keyword(def) ident(toString) operator(=) ident(showFullKey)operator(()ident(key)operator(\)) + operator(}) + directive(final) type(class) class(Flattened)operator(()keyword(val) ident(key)operator(:) ident(ScopedKey)operator([)ident(_)operator(])operator(,) keyword(val) ident(dependencies)operator(:) predefined_type(Iterable)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(])operator(\)) + + keyword(def) ident(flattenLocals)operator(()ident(compiled)operator(:) ident(CompiledMap)operator(\))operator(:) predefined_type(Map)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(,) ident(Flattened)operator(]) operator(=) + operator({) + keyword(import) ident(collection)operator(.)ident(breakOut) + keyword(val) ident(locals) operator(=) ident(compiled) ident(flatMap) operator({) keyword(case) operator(()ident(key)operator(,) ident(comp)operator(\)) operator(=)operator(>) keyword(if) operator(()ident(key)operator(.)ident(key)operator(.)ident(isLocal)operator(\)) predefined_type(Seq)operator([)ident(Compiled)operator([)ident(_)operator(])operator(])operator(()ident(comp)operator(\)) keyword(else) predefined_type(Nil) operator(}) + keyword(val) ident(ordered) operator(=) ident(Dag)operator(.)ident(topologicalSort)operator(()ident(locals)operator(\))operator(()ident(_)operator(.)ident(dependencies)operator(.)ident(flatMap)operator(()ident(dep) operator(=)operator(>) keyword(if) operator(()ident(dep)operator(.)ident(key)operator(.)ident(isLocal)operator(\)) predefined_type(Seq)operator([)ident(Compiled)operator([)ident(_)operator(])operator(])operator(()ident(compiled)operator(()ident(dep)operator(\))operator(\)) keyword(else) predefined_type(Nil)operator(\))operator(\)) + keyword(def) ident(flatten)operator(()ident(cmap)operator(:) predefined_type(Map)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(,) ident(Flattened)operator(])operator(,) ident(key)operator(:) ident(ScopedKey)operator([)ident(_)operator(])operator(,) ident(deps)operator(:) predefined_type(Iterable)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(])operator(\))operator(:) ident(Flattened) operator(=) + keyword(new) ident(Flattened)operator(()ident(key)operator(,) ident(deps)operator(.)ident(flatMap)operator(()ident(dep) operator(=)operator(>) keyword(if) operator(()ident(dep)operator(.)ident(key)operator(.)ident(isLocal)operator(\)) ident(cmap)operator(()ident(dep)operator(\))operator(.)ident(dependencies) keyword(else) ident(dep) operator(:)operator(:) predefined_type(Nil)operator(\))operator(\)) + + keyword(val) ident(empty) operator(=) predefined_type(Map)operator(.)ident(empty)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(,) ident(Flattened)operator(]) + keyword(val) ident(flattenedLocals) operator(=) operator(()ident(empty) operator(/)operator(:) ident(ordered)operator(\)) operator({) operator(()ident(cmap)operator(,) ident(c)operator(\)) operator(=)operator(>) ident(cmap)operator(.)ident(updated)operator(()ident(c)operator(.)ident(key)operator(,) ident(flatten)operator(()ident(cmap)operator(,) ident(c)operator(.)ident(key)operator(,) ident(c)operator(.)ident(dependencies)operator(\))operator(\)) operator(}) + ident(compiled) ident(flatMap) operator({) + keyword(case) operator(()ident(key)operator(,) ident(comp)operator(\)) operator(=)operator(>) + keyword(if) operator(()ident(key)operator(.)ident(key)operator(.)ident(isLocal)operator(\)) + predefined_type(Nil) + keyword(else) + predefined_type(Seq)operator([)operator(()ident(ScopedKey)operator([)ident(_)operator(])operator(,) ident(Flattened)operator(\))operator(])operator(()operator(()ident(key)operator(,) ident(flatten)operator(()ident(flattenedLocals)operator(,) ident(key)operator(,) ident(comp)operator(.)ident(dependencies)operator(\))operator(\))operator(\)) + operator(}) + operator(}) + + keyword(def) ident(definedAtString)operator(()ident(settings)operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(_)operator(])operator(])operator(\))operator(:) ident(String) operator(=) + operator({) + keyword(val) ident(posDefined) operator(=) ident(settings)operator(.)ident(flatMap)operator(()ident(_)operator(.)ident(positionString)operator(.)ident(toList)operator(\)) + keyword(if) operator(()ident(posDefined)operator(.)ident(size) operator(>) integer(0)operator(\)) operator({) + keyword(val) ident(header) operator(=) keyword(if) operator(()ident(posDefined)operator(.)ident(size) operator(==) ident(settings)operator(.)ident(size)operator(\)) string keyword(else) + string + ident(header) operator(+) operator(()ident(posDefined)operator(.)ident(distinct) ident(mkString) operator(()stringoperator(,) stringoperator(,) stringoperator(\))operator(\)) + operator(}) keyword(else) string + operator(}) + + comment(/** + * Intersects two scopes, returning the more specific one if they intersect, or None otherwise. + */) + directive(private)operator([)ident(sbt)operator(]) keyword(def) ident(intersect)operator(()ident(s1)operator(:) ident(Scope)operator(,) ident(s2)operator(:) ident(Scope)operator(\))operator(()keyword(implicit) ident(delegates)operator(:) ident(Scope) operator(=)operator(>) predefined_type(Seq)operator([)ident(Scope)operator(])operator(\))operator(:) predefined_type(Option)operator([)ident(Scope)operator(]) operator(=) + keyword(if) operator(()ident(delegates)operator(()ident(s1)operator(\))operator(.)ident(contains)operator(()ident(s2)operator(\))operator(\)) predefined_type(Some)operator(()ident(s1)operator(\)) comment(// s1 is more specific) + keyword(else) keyword(if) operator(()ident(delegates)operator(()ident(s2)operator(\))operator(.)ident(contains)operator(()ident(s1)operator(\))operator(\)) predefined_type(Some)operator(()ident(s2)operator(\)) comment(// s2 is more specific) + keyword(else) predefined_type(None) + + directive(private)operator([)local_variable(this)operator(]) keyword(def) ident(deriveAndLocal)operator(()ident(init)operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(_)operator(])operator(])operator(\))operator(()keyword(implicit) ident(delegates)operator(:) ident(Scope) operator(=)operator(>) predefined_type(Seq)operator([)ident(Scope)operator(])operator(,) ident(scopeLocal)operator(:) ident(ScopeLocal)operator(\))operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(_)operator(])operator(]) operator(=) + operator({) + keyword(import) ident(collection)operator(.)ident(mutable) + + directive(final) type(class) class(Derived)operator(()keyword(val) ident(setting)operator(:) ident(DerivedSetting)operator([)ident(_)operator(])operator(\)) operator({) + keyword(val) ident(dependencies) operator(=) ident(setting)operator(.)ident(dependencies)operator(.)ident(map)operator(()ident(_)operator(.)ident(key)operator(\)) + keyword(def) ident(triggeredBy) operator(=) ident(dependencies)operator(.)ident(filter)operator(()ident(setting)operator(.)ident(trigger)operator(\)) + keyword(val) ident(inScopes) operator(=) keyword(new) ident(mutable)operator(.)ident(HashSet)operator([)ident(Scope)operator(]) + keyword(val) ident(outputs) operator(=) keyword(new) ident(mutable)operator(.)ident(ListBuffer)operator([)ident(Setting)operator([)ident(_)operator(])operator(]) + operator(}) + directive(final) type(class) class(Deriveds)operator(()keyword(val) ident(key)operator(:) ident(AttributeKey)operator([)ident(_)operator(])operator(,) keyword(val) ident(settings)operator(:) ident(mutable)operator(.)ident(ListBuffer)operator([)ident(Derived)operator(])operator(\)) operator({) + keyword(def) ident(dependencies) operator(=) ident(settings)operator(.)ident(flatMap)operator(()ident(_)operator(.)ident(dependencies)operator(\)) + comment(// This is mainly for use in the cyclic reference error message) + keyword(override) keyword(def) ident(toString) operator(=) ident(s)string + operator(}) + + comment(// separate `derived` settings from normal settings (`defs`\)) + keyword(val) operator(()ident(derived)operator(,) ident(rawDefs)operator(\)) operator(=) ident(Util)operator(.)ident(separate)operator([)ident(Setting)operator([)ident(_)operator(])operator(,) ident(Derived)operator(,) ident(Setting)operator([)ident(_)operator(])operator(])operator(()ident(init)operator(\)) operator({) keyword(case) ident(d)operator(:) ident(DerivedSetting)operator([)ident(_)operator(]) operator(=)operator(>) predefined_type(Left)operator(()keyword(new) ident(Derived)operator(()ident(d)operator(\))operator(\))operator(;) keyword(case) ident(s) operator(=)operator(>) predefined_type(Right)operator(()ident(s)operator(\)) operator(}) + keyword(val) ident(defs) operator(=) ident(addLocal)operator(()ident(rawDefs)operator(\))operator(()ident(scopeLocal)operator(\)) + + comment(// group derived settings by the key they define) + keyword(val) ident(derivsByDef) operator(=) keyword(new) ident(mutable)operator(.)ident(HashMap)operator([)ident(AttributeKey)operator([)ident(_)operator(])operator(,) ident(Deriveds)operator(]) + keyword(for) operator(()ident(s) operator(<)operator(-) ident(derived)operator(\)) operator({) + keyword(val) ident(key) operator(=) ident(s)operator(.)ident(setting)operator(.)ident(key)operator(.)ident(key) + ident(derivsByDef)operator(.)ident(getOrElseUpdate)operator(()ident(key)operator(,) keyword(new) ident(Deriveds)operator(()ident(key)operator(,) keyword(new) ident(mutable)operator(.)ident(ListBuffer)operator(\))operator(\))operator(.)ident(settings) operator(+=) ident(s) + operator(}) + + comment(// sort derived settings so that dependencies come first) + comment(// this is necessary when verifying that a derived setting's dependencies exist) + keyword(val) ident(ddeps) operator(=) operator(()ident(d)operator(:) ident(Deriveds)operator(\)) operator(=)operator(>) ident(d)operator(.)ident(dependencies)operator(.)ident(flatMap)operator(()ident(derivsByDef)operator(.)ident(get)operator(\)) + keyword(val) ident(sortedDerivs) operator(=) ident(Dag)operator(.)ident(topologicalSort)operator(()ident(derivsByDef)operator(.)ident(values)operator(\))operator(()ident(ddeps)operator(\)) + + comment(// index derived settings by triggering key. This maps a key to the list of settings potentially derived from it.) + keyword(val) ident(derivedBy) operator(=) keyword(new) ident(mutable)operator(.)ident(HashMap)operator([)ident(AttributeKey)operator([)ident(_)operator(])operator(,) ident(mutable)operator(.)ident(ListBuffer)operator([)ident(Derived)operator(])operator(]) + keyword(for) operator(()ident(s) operator(<)operator(-) ident(derived)operator(;) ident(d) operator(<)operator(-) ident(s)operator(.)ident(triggeredBy)operator(\)) + ident(derivedBy)operator(.)ident(getOrElseUpdate)operator(()ident(d)operator(,) keyword(new) ident(mutable)operator(.)ident(ListBuffer)operator(\)) operator(+=) ident(s) + + comment(// Map a DerivedSetting[_] to the `Derived` struct wrapping it. Used to ultimately replace a DerivedSetting with) + comment(// the `Setting`s that were actually derived from it: `Derived.outputs`) + keyword(val) ident(derivedToStruct)operator(:) predefined_type(Map)operator([)ident(DerivedSetting)operator([)ident(_)operator(])operator(,) ident(Derived)operator(]) operator(=) operator(()ident(derived) ident(map) operator({) ident(s) operator(=)operator(>) ident(s)operator(.)ident(setting) operator(-)operator(>) ident(s) operator(})operator(\))operator(.)ident(toMap) + + comment(// set of defined scoped keys, used to ensure a derived setting is only added if all dependencies are present) + keyword(val) ident(defined) operator(=) keyword(new) ident(mutable)operator(.)ident(HashSet)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(]) + keyword(def) ident(addDefs)operator(()ident(ss)operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(_)operator(])operator(])operator(\)) operator({) keyword(for) operator(()ident(s) operator(<)operator(-) ident(ss)operator(\)) ident(defined) operator(+=) ident(s)operator(.)ident(key) operator(}) + ident(addDefs)operator(()ident(defs)operator(\)) + + comment(// true iff the scoped key is in `defined`, taking delegation into account) + keyword(def) ident(isDefined)operator(()ident(key)operator(:) ident(AttributeKey)operator([)ident(_)operator(])operator(,) ident(scope)operator(:) ident(Scope)operator(\)) operator(=) + ident(delegates)operator(()ident(scope)operator(\))operator(.)ident(exists)operator(()ident(s) operator(=)operator(>) ident(defined)operator(.)ident(contains)operator(()ident(ScopedKey)operator(()ident(s)operator(,) ident(key)operator(\))operator(\))operator(\)) + + comment(// true iff all dependencies of derived setting `d` have a value (potentially via delegation\) in `scope`) + keyword(def) ident(allDepsDefined)operator(()ident(d)operator(:) ident(Derived)operator(,) ident(scope)operator(:) ident(Scope)operator(,) ident(local)operator(:) predefined_type(Set)operator([)ident(AttributeKey)operator([)ident(_)operator(])operator(])operator(\))operator(:) predefined_type(Boolean) operator(=) + ident(d)operator(.)ident(dependencies)operator(.)ident(forall)operator(()ident(dep) operator(=)operator(>) ident(local)operator(()ident(dep)operator(\)) operator(||) ident(isDefined)operator(()ident(dep)operator(,) ident(scope)operator(\))operator(\)) + + comment(// Returns the list of injectable derived settings and their local settings for `sk`.) + comment(// The settings are to be injected under `outputScope` = whichever scope is more specific of:) + comment(// * the dependency's (`sk`\) scope) + comment(// * the DerivedSetting's scope in which it has been declared, `definingScope`) + comment(// provided that these two scopes intersect.) + comment(// A derived setting is injectable if:) + comment(// 1. it has not been previously injected into outputScope) + comment(// 2. it applies to outputScope (as determined by its `filter`\)) + comment(// 3. all of its dependencies are defined for outputScope (allowing for delegation\)) + comment(// This needs to handle local settings because a derived setting wouldn't be injected if it's local setting didn't exist yet.) + keyword(val) ident(deriveFor) operator(=) operator(()ident(sk)operator(:) ident(ScopedKey)operator([)ident(_)operator(])operator(\)) operator(=)operator(>) operator({) + keyword(val) ident(derivedForKey)operator(:) predefined_type(List)operator([)ident(Derived)operator(]) operator(=) ident(derivedBy)operator(.)ident(get)operator(()ident(sk)operator(.)ident(key)operator(\))operator(.)ident(toList)operator(.)ident(flatten) + keyword(val) ident(scope) operator(=) ident(sk)operator(.)ident(scope) + keyword(def) ident(localAndDerived)operator(()ident(d)operator(:) ident(Derived)operator(\))operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(_)operator(])operator(]) operator(=) operator({) + keyword(def) ident(definingScope) operator(=) ident(d)operator(.)ident(setting)operator(.)ident(key)operator(.)ident(scope) + keyword(val) ident(outputScope) operator(=) ident(intersect)operator(()ident(scope)operator(,) ident(definingScope)operator(\)) + ident(outputScope) ident(collect) operator({) + keyword(case) ident(s) keyword(if) operator(!)ident(d)operator(.)ident(inScopes)operator(.)ident(contains)operator(()ident(s)operator(\)) operator(&&) ident(d)operator(.)ident(setting)operator(.)ident(filter)operator(()ident(s)operator(\)) operator(=)operator(>) + keyword(val) ident(local) operator(=) ident(d)operator(.)ident(dependencies)operator(.)ident(flatMap)operator(()ident(dep) operator(=)operator(>) ident(scopeLocal)operator(()ident(ScopedKey)operator(()ident(s)operator(,) ident(dep)operator(\))operator(\))operator(\)) + keyword(if) operator(()ident(allDepsDefined)operator(()ident(d)operator(,) ident(s)operator(,) ident(local)operator(.)ident(map)operator(()ident(_)operator(.)ident(key)operator(.)ident(key)operator(\))operator(.)ident(toSet)operator(\))operator(\)) operator({) + ident(d)operator(.)ident(inScopes)operator(.)ident(add)operator(()ident(s)operator(\)) + keyword(val) ident(out) operator(=) ident(local) operator(:)operator(+) ident(d)operator(.)ident(setting)operator(.)ident(setScope)operator(()ident(s)operator(\)) + ident(d)operator(.)ident(outputs) operator(++)operator(=) ident(out) + ident(out) + operator(}) keyword(else) + predefined_type(Nil) + operator(}) ident(getOrElse) predefined_type(Nil) + operator(}) + ident(derivedForKey)operator(.)ident(flatMap)operator(()ident(localAndDerived)operator(\)) + operator(}) + + keyword(val) ident(processed) operator(=) keyword(new) ident(mutable)operator(.)ident(HashSet)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(]) + + comment(// derives settings, transitively so that a derived setting can trigger another) + keyword(def) ident(process)operator(()ident(rem)operator(:) predefined_type(List)operator([)ident(Setting)operator([)ident(_)operator(])operator(])operator(\))operator(:) predefined_type(Unit) operator(=) ident(rem) keyword(match) operator({) + keyword(case) ident(s) operator(:)operator(:) ident(ss) operator(=)operator(>) + keyword(val) ident(sk) operator(=) ident(s)operator(.)ident(key) + keyword(val) ident(ds) operator(=) keyword(if) operator(()ident(processed)operator(.)ident(add)operator(()ident(sk)operator(\))operator(\)) ident(deriveFor)operator(()ident(sk)operator(\)) keyword(else) predefined_type(Nil) + ident(addDefs)operator(()ident(ds)operator(\)) + ident(process)operator(()ident(ds) operator(:)operator(:)operator(:) ident(ss)operator(\)) + keyword(case) predefined_type(Nil) operator(=)operator(>) + operator(}) + ident(process)operator(()ident(defs)operator(.)ident(toList)operator(\)) + + comment(// Take all the original defs and DerivedSettings along with locals, replace each DerivedSetting with the actual) + comment(// settings that were derived.) + keyword(val) ident(allDefs) operator(=) ident(addLocal)operator(()ident(init)operator(\))operator(()ident(scopeLocal)operator(\)) + ident(allDefs) ident(flatMap) operator({) keyword(case) ident(d)operator(:) ident(DerivedSetting)operator([)ident(_)operator(]) operator(=)operator(>) operator(()ident(derivedToStruct) ident(get) ident(d) ident(map) operator(()ident(_)operator(.)ident(outputs)operator(\))operator(\))operator(.)ident(toStream)operator(.)ident(flatten)operator(;) keyword(case) ident(s) operator(=)operator(>) predefined_type(Stream)operator(()ident(s)operator(\)) operator(}) + operator(}) + + keyword(sealed) keyword(trait) class(Initialize)operator([)ident(T)operator(]) operator({) + keyword(def) ident(dependencies)operator(:) predefined_type(Seq)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(]) + keyword(def) ident(apply)operator([)ident(S)operator(])operator(()ident(g)operator(:) ident(T) operator(=)operator(>) ident(S)operator(\))operator(:) ident(Initialize)operator([)ident(S)operator(]) + + annotation(@deprecated)operator(()stringoperator(,) stringoperator(\)) + keyword(def) ident(mapReferenced)operator(()ident(g)operator(:) ident(MapScoped)operator(\))operator(:) ident(Initialize)operator([)ident(T)operator(]) + annotation(@deprecated)operator(()stringoperator(,) stringoperator(\)) + keyword(def) ident(mapConstant)operator(()ident(g)operator(:) ident(MapConstant)operator(\))operator(:) ident(Initialize)operator([)ident(T)operator(]) + + annotation(@deprecated)operator(()stringoperator(,) stringoperator(\)) + keyword(def) ident(validateReferenced)operator(()ident(g)operator(:) ident(ValidateRef)operator(\))operator(:) ident(ValidatedInit)operator([)ident(T)operator(]) operator(=) + ident(validateKeyReferenced)operator(()keyword(new) ident(ValidateKeyRef) operator({) keyword(def) ident(apply)operator([)ident(T)operator(])operator(()ident(key)operator(:) ident(ScopedKey)operator([)ident(T)operator(])operator(,) ident(selfRefOk)operator(:) predefined_type(Boolean)operator(\)) operator(=) ident(g)operator(()ident(key)operator(\)) operator(})operator(\)) + + directive(private)operator([)ident(sbt)operator(]) keyword(def) ident(validateKeyReferenced)operator(()ident(g)operator(:) ident(ValidateKeyRef)operator(\))operator(:) ident(ValidatedInit)operator([)ident(T)operator(]) + + keyword(def) ident(evaluate)operator(()ident(map)operator(:) ident(Settings)operator([)ident(Scope)operator(])operator(\))operator(:) ident(T) + keyword(def) ident(zip)operator([)ident(S)operator(])operator(()ident(o)operator(:) ident(Initialize)operator([)ident(S)operator(])operator(\))operator(:) ident(Initialize)operator([)operator(()ident(T)operator(,) ident(S)operator(\))operator(]) operator(=) ident(zipTupled)operator(()ident(o)operator(\))operator(()ident(idFun)operator(\)) + keyword(def) ident(zipWith)operator([)ident(S)operator(,) ident(U)operator(])operator(()ident(o)operator(:) ident(Initialize)operator([)ident(S)operator(])operator(\))operator(()ident(f)operator(:) operator(()ident(T)operator(,) ident(S)operator(\)) operator(=)operator(>) ident(U)operator(\))operator(:) ident(Initialize)operator([)ident(U)operator(]) operator(=) ident(zipTupled)operator(()ident(o)operator(\))operator(()ident(f)operator(.)ident(tupled)operator(\)) + directive(private)operator([)local_variable(this)operator(]) keyword(def) ident(zipTupled)operator([)ident(S)operator(,) ident(U)operator(])operator(()ident(o)operator(:) ident(Initialize)operator([)ident(S)operator(])operator(\))operator(()ident(f)operator(:) operator(()operator(()ident(T)operator(,) ident(S)operator(\))operator(\)) operator(=)operator(>) ident(U)operator(\))operator(:) ident(Initialize)operator([)ident(U)operator(]) operator(=) + keyword(new) ident(Apply)operator([)operator(()operator({) keyword(type) ident(l)operator([)ident(L)operator([)ident(x)operator(])operator(]) operator(=) operator(()ident(L)operator([)ident(T)operator(])operator(,) ident(L)operator([)ident(S)operator(])operator(\)) operator(})operator(\))error(#)ident(l)operator(,) ident(U)operator(])operator(()ident(f)operator(,) operator(()local_variable(this)operator(,) ident(o)operator(\))operator(,) ident(AList)operator(.)ident(tuple2)operator([)ident(T)operator(,) ident(S)operator(])operator(\)) + comment(/** A fold on the static attributes of this and nested Initializes. */) + directive(private)operator([)ident(sbt)operator(]) keyword(def) ident(processAttributes)operator([)ident(S)operator(])operator(()ident(init)operator(:) ident(S)operator(\))operator(()ident(f)operator(:) operator(()ident(S)operator(,) ident(AttributeMap)operator(\)) operator(=)operator(>) ident(S)operator(\))operator(:) ident(S) + operator(}) + keyword(object) ident(Initialize) operator({) + keyword(implicit) keyword(def) ident(joinInitialize)operator([)ident(T)operator(])operator(()ident(s)operator(:) predefined_type(Seq)operator([)ident(Initialize)operator([)ident(T)operator(])operator(])operator(\))operator(:) ident(JoinInitSeq)operator([)ident(T)operator(]) operator(=) keyword(new) ident(JoinInitSeq)operator(()ident(s)operator(\)) + directive(final) type(class) class(JoinInitSeq)operator([)ident(T)operator(])operator(()ident(s)operator(:) predefined_type(Seq)operator([)ident(Initialize)operator([)ident(T)operator(])operator(])operator(\)) operator({) + keyword(def) ident(joinWith)operator([)ident(S)operator(])operator(()ident(f)operator(:) predefined_type(Seq)operator([)ident(T)operator(]) operator(=)operator(>) ident(S)operator(\))operator(:) ident(Initialize)operator([)ident(S)operator(]) operator(=) ident(uniform)operator(()ident(s)operator(\))operator(()ident(f)operator(\)) + keyword(def) ident(join)operator(:) ident(Initialize)operator([)predefined_type(Seq)operator([)ident(T)operator(])operator(]) operator(=) ident(uniform)operator(()ident(s)operator(\))operator(()ident(idFun)operator(\)) + operator(}) + keyword(def) ident(join)operator([)ident(T)operator(])operator(()ident(inits)operator(:) predefined_type(Seq)operator([)ident(Initialize)operator([)ident(T)operator(])operator(])operator(\))operator(:) ident(Initialize)operator([)predefined_type(Seq)operator([)ident(T)operator(])operator(]) operator(=) ident(uniform)operator(()ident(inits)operator(\))operator(()ident(idFun)operator(\)) + keyword(def) ident(joinAny)operator([)ident(M)operator([)ident(_)operator(])operator(])operator(()ident(inits)operator(:) predefined_type(Seq)operator([)ident(Initialize)operator([)ident(M)operator([)ident(T)operator(])operator(]) keyword(forSome) operator({) keyword(type) ident(T) operator(})operator(])operator(\))operator(:) ident(Initialize)operator([)predefined_type(Seq)operator([)ident(M)operator([)ident(_)operator(])operator(])operator(]) operator(=) + ident(join)operator(()ident(inits)operator(.)ident(asInstanceOf)operator([)predefined_type(Seq)operator([)ident(Initialize)operator([)ident(M)operator([)predefined_type(Any)operator(])operator(])operator(])operator(])operator(\))operator(.)ident(asInstanceOf)operator([)ident(Initialize)operator([)predefined_type(Seq)operator([)ident(M)operator([)ident(T)operator(]) keyword(forSome) operator({) keyword(type) ident(T) operator(})operator(])operator(])operator(]) + operator(}) + keyword(object) ident(SettingsDefinition) operator({) + keyword(implicit) keyword(def) ident(unwrapSettingsDefinition)operator(()ident(d)operator(:) ident(SettingsDefinition)operator(\))operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(_)operator(])operator(]) operator(=) ident(d)operator(.)ident(settings) + keyword(implicit) keyword(def) ident(wrapSettingsDefinition)operator(()ident(ss)operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(_)operator(])operator(])operator(\))operator(:) ident(SettingsDefinition) operator(=) keyword(new) ident(SettingList)operator(()ident(ss)operator(\)) + operator(}) + keyword(sealed) keyword(trait) class(SettingsDefinition) operator({) + keyword(def) ident(settings)operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(_)operator(])operator(]) + operator(}) + directive(final) type(class) class(SettingList)operator(()keyword(val) ident(settings)operator(:) predefined_type(Seq)operator([)ident(Setting)operator([)ident(_)operator(])operator(])operator(\)) directive(extends) ident(SettingsDefinition) + keyword(sealed) type(class) class(Setting)operator([)ident(T)operator(]) directive(private)operator([)ident(Init)operator(]) operator(()keyword(val) ident(key)operator(:) ident(ScopedKey)operator([)ident(T)operator(])operator(,) keyword(val) ident(init)operator(:) ident(Initialize)operator([)ident(T)operator(])operator(,) keyword(val) ident(pos)operator(:) ident(SourcePosition)operator(\)) directive(extends) ident(SettingsDefinition) operator({) + keyword(def) ident(settings) operator(=) local_variable(this) operator(:)operator(:) predefined_type(Nil) + keyword(def) ident(definitive)operator(:) predefined_type(Boolean) operator(=) operator(!)ident(init)operator(.)ident(dependencies)operator(.)ident(contains)operator(()ident(key)operator(\)) + keyword(def) ident(dependencies)operator(:) predefined_type(Seq)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(]) operator(=) ident(remove)operator(()ident(init)operator(.)ident(dependencies)operator(,) ident(key)operator(\)) + annotation(@deprecated)operator(()stringoperator(,) stringoperator(\)) + keyword(def) ident(mapReferenced)operator(()ident(g)operator(:) ident(MapScoped)operator(\))operator(:) ident(Setting)operator([)ident(T)operator(]) operator(=) ident(make)operator(()ident(key)operator(,) ident(init) ident(mapReferenced) ident(g)operator(,) ident(pos)operator(\)) + annotation(@deprecated)operator(()stringoperator(,) stringoperator(\)) + keyword(def) ident(validateReferenced)operator(()ident(g)operator(:) ident(ValidateRef)operator(\))operator(:) predefined_type(Either)operator([)predefined_type(Seq)operator([)ident(Undefined)operator(])operator(,) ident(Setting)operator([)ident(T)operator(])operator(]) operator(=) operator(()ident(init) ident(validateReferenced) ident(g)operator(\))operator(.)ident(right)operator(.)ident(map)operator(()ident(newI) operator(=)operator(>) ident(make)operator(()ident(key)operator(,) ident(newI)operator(,) ident(pos)operator(\))operator(\)) + + directive(private)operator([)ident(sbt)operator(]) keyword(def) ident(validateKeyReferenced)operator(()ident(g)operator(:) ident(ValidateKeyRef)operator(\))operator(:) predefined_type(Either)operator([)predefined_type(Seq)operator([)ident(Undefined)operator(])operator(,) ident(Setting)operator([)ident(T)operator(])operator(]) operator(=) + operator(()ident(init) ident(validateKeyReferenced) ident(g)operator(\))operator(.)ident(right)operator(.)ident(map)operator(()ident(newI) operator(=)operator(>) ident(make)operator(()ident(key)operator(,) ident(newI)operator(,) ident(pos)operator(\))operator(\)) + + keyword(def) ident(mapKey)operator(()ident(g)operator(:) ident(MapScoped)operator(\))operator(:) ident(Setting)operator([)ident(T)operator(]) operator(=) ident(make)operator(()ident(g)operator(()ident(key)operator(\))operator(,) ident(init)operator(,) ident(pos)operator(\)) + keyword(def) ident(mapInit)operator(()ident(f)operator(:) operator(()ident(ScopedKey)operator([)ident(T)operator(])operator(,) ident(T)operator(\)) operator(=)operator(>) ident(T)operator(\))operator(:) ident(Setting)operator([)ident(T)operator(]) operator(=) ident(make)operator(()ident(key)operator(,) ident(init)operator(()ident(t) operator(=)operator(>) ident(f)operator(()ident(key)operator(,) ident(t)operator(\))operator(\))operator(,) ident(pos)operator(\)) + annotation(@deprecated)operator(()stringoperator(,) stringoperator(\)) + keyword(def) ident(mapConstant)operator(()ident(g)operator(:) ident(MapConstant)operator(\))operator(:) ident(Setting)operator([)ident(T)operator(]) operator(=) ident(make)operator(()ident(key)operator(,) ident(init) ident(mapConstant) ident(g)operator(,) ident(pos)operator(\)) + keyword(def) ident(withPos)operator(()ident(pos)operator(:) ident(SourcePosition)operator(\)) operator(=) ident(make)operator(()ident(key)operator(,) ident(init)operator(,) ident(pos)operator(\)) + keyword(def) ident(positionString)operator(:) predefined_type(Option)operator([)ident(String)operator(]) operator(=) ident(pos) keyword(match) operator({) + keyword(case) ident(pos)operator(:) ident(FilePosition) operator(=)operator(>) predefined_type(Some)operator(()ident(pos)operator(.)ident(path) operator(+) string operator(+) ident(pos)operator(.)ident(startLine)operator(\)) + keyword(case) ident(NoPosition) operator(=)operator(>) predefined_type(None) + operator(}) + directive(private)operator([)ident(sbt)operator(]) keyword(def) ident(mapInitialize)operator(()ident(f)operator(:) ident(Initialize)operator([)ident(T)operator(]) operator(=)operator(>) ident(Initialize)operator([)ident(T)operator(])operator(\))operator(:) ident(Setting)operator([)ident(T)operator(]) operator(=) ident(make)operator(()ident(key)operator(,) ident(f)operator(()ident(init)operator(\))operator(,) ident(pos)operator(\)) + keyword(override) keyword(def) ident(toString) operator(=) string operator(+) ident(key) operator(+) string operator(+) ident(pos) + + directive(protected)operator([)local_variable(this)operator(]) keyword(def) ident(make)operator([)ident(T)operator(])operator(()ident(key)operator(:) ident(ScopedKey)operator([)ident(T)operator(])operator(,) ident(init)operator(:) ident(Initialize)operator([)ident(T)operator(])operator(,) ident(pos)operator(:) ident(SourcePosition)operator(\))operator(:) ident(Setting)operator([)ident(T)operator(]) operator(=) keyword(new) ident(Setting)operator([)ident(T)operator(])operator(()ident(key)operator(,) ident(init)operator(,) ident(pos)operator(\)) + directive(protected)operator([)ident(sbt)operator(]) keyword(def) ident(isDerived)operator(:) predefined_type(Boolean) operator(=) predefined_constant(false) + directive(private)operator([)ident(sbt)operator(]) keyword(def) ident(setScope)operator(()ident(s)operator(:) ident(Scope)operator(\))operator(:) ident(Setting)operator([)ident(T)operator(]) operator(=) ident(make)operator(()ident(key)operator(.)ident(copy)operator(()ident(scope) operator(=) ident(s)operator(\))operator(,) ident(init)operator(.)ident(mapReferenced)operator(()ident(mapScope)operator(()reserved(const)operator(()ident(s)operator(\))operator(\))operator(\))operator(,) ident(pos)operator(\)) + comment(/** Turn this setting into a `DefaultSetting` if it's not already, otherwise returns `this` */) + directive(private)operator([)ident(sbt)operator(]) keyword(def) ident(default)operator(()ident(id)operator(:) operator(=)operator(>) predefined_type(Long) operator(=) ident(nextDefaultID)operator(()operator(\))operator(\))operator(:) ident(DefaultSetting)operator([)ident(T)operator(]) operator(=) ident(DefaultSetting)operator(()ident(key)operator(,) ident(init)operator(,) ident(pos)operator(,) ident(id)operator(\)) + operator(}) + directive(private)operator([)ident(Init)operator(]) keyword(sealed) type(class) class(DerivedSetting)operator([)ident(T)operator(])operator(()ident(sk)operator(:) ident(ScopedKey)operator([)ident(T)operator(])operator(,) ident(i)operator(:) ident(Initialize)operator([)ident(T)operator(])operator(,) ident(p)operator(:) ident(SourcePosition)operator(,) keyword(val) ident(filter)operator(:) ident(Scope) operator(=)operator(>) predefined_type(Boolean)operator(,) keyword(val) ident(trigger)operator(:) ident(AttributeKey)operator([)ident(_)operator(]) operator(=)operator(>) predefined_type(Boolean)operator(\)) directive(extends) ident(Setting)operator([)ident(T)operator(])operator(()ident(sk)operator(,) ident(i)operator(,) ident(p)operator(\)) operator({) + keyword(override) keyword(def) ident(make)operator([)ident(T)operator(])operator(()ident(key)operator(:) ident(ScopedKey)operator([)ident(T)operator(])operator(,) ident(init)operator(:) ident(Initialize)operator([)ident(T)operator(])operator(,) ident(pos)operator(:) ident(SourcePosition)operator(\))operator(:) ident(Setting)operator([)ident(T)operator(]) operator(=) keyword(new) ident(DerivedSetting)operator([)ident(T)operator(])operator(()ident(key)operator(,) ident(init)operator(,) ident(pos)operator(,) ident(filter)operator(,) ident(trigger)operator(\)) + directive(protected)operator([)ident(sbt)operator(]) keyword(override) keyword(def) ident(isDerived)operator(:) predefined_type(Boolean) operator(=) predefined_constant(true) + keyword(override) keyword(def) ident(default)operator(()ident(_id)operator(:) operator(=)operator(>) predefined_type(Long)operator(\))operator(:) ident(DefaultSetting)operator([)ident(T)operator(]) operator(=) keyword(new) ident(DerivedSetting)operator([)ident(T)operator(])operator(()ident(sk)operator(,) ident(i)operator(,) ident(p)operator(,) ident(filter)operator(,) ident(trigger)operator(\)) keyword(with) ident(DefaultSetting)operator([)ident(T)operator(]) operator({) keyword(val) ident(id) operator(=) ident(_id) operator(}) + keyword(override) keyword(def) ident(toString) operator(=) string operator(+) local_variable(super)operator(.)ident(toString) + operator(}) + comment(// Only keep the first occurence of this setting and move it to the front so that it has lower precedence than non-defaults.) + comment(// This is intended for internal sbt use only, where alternatives like Plugin.globalSettings are not available.) + directive(private)operator([)ident(Init)operator(]) keyword(sealed) keyword(trait) class(DefaultSetting)operator([)ident(T)operator(]) directive(extends) ident(Setting)operator([)ident(T)operator(]) operator({) + keyword(val) ident(id)operator(:) predefined_type(Long) + keyword(override) keyword(def) ident(make)operator([)ident(T)operator(])operator(()ident(key)operator(:) ident(ScopedKey)operator([)ident(T)operator(])operator(,) ident(init)operator(:) ident(Initialize)operator([)ident(T)operator(])operator(,) ident(pos)operator(:) ident(SourcePosition)operator(\))operator(:) ident(Setting)operator([)ident(T)operator(]) operator(=) local_variable(super)operator(.)ident(make)operator(()ident(key)operator(,) ident(init)operator(,) ident(pos)operator(\)) ident(default) ident(id) + keyword(override) directive(final) keyword(def) ident(hashCode) operator(=) ident(id)operator(.)ident(hashCode) + keyword(override) directive(final) keyword(def) ident(equals)operator(()ident(o)operator(:) predefined_type(Any)operator(\))operator(:) predefined_type(Boolean) operator(=) ident(o) keyword(match) operator({) keyword(case) ident(d)operator(:) ident(DefaultSetting)operator([)ident(_)operator(]) operator(=)operator(>) ident(d)operator(.)ident(id) operator(==) ident(id)operator(;) keyword(case) ident(_) operator(=)operator(>) predefined_constant(false) operator(}) + keyword(override) keyword(def) ident(toString) operator(=) ident(s)string operator(+) local_variable(super)operator(.)ident(toString) + keyword(override) keyword(def) ident(default)operator(()ident(id)operator(:) operator(=)operator(>) predefined_type(Long)operator(\)) operator(=) local_variable(this) + operator(}) + + keyword(object) ident(DefaultSetting) operator({) + keyword(def) ident(apply)operator([)ident(T)operator(])operator(()ident(sk)operator(:) ident(ScopedKey)operator([)ident(T)operator(])operator(,) ident(i)operator(:) ident(Initialize)operator([)ident(T)operator(])operator(,) ident(p)operator(:) ident(SourcePosition)operator(,) ident(_id)operator(:) predefined_type(Long)operator(\)) operator(=) keyword(new) ident(Setting)operator([)ident(T)operator(])operator(()ident(sk)operator(,) ident(i)operator(,) ident(p)operator(\)) keyword(with) ident(DefaultSetting)operator([)ident(T)operator(]) operator({) keyword(val) ident(id) operator(=) ident(_id) operator(}) + operator(}) + + directive(private)operator([)local_variable(this)operator(]) keyword(def) ident(handleUndefined)operator([)ident(T)operator(])operator(()ident(vr)operator(:) ident(ValidatedInit)operator([)ident(T)operator(])operator(\))operator(:) ident(Initialize)operator([)ident(T)operator(]) operator(=) ident(vr) keyword(match) operator({) + keyword(case) predefined_type(Left)operator(()ident(undefs)operator(\)) operator(=)operator(>) keyword(throw) keyword(new) ident(RuntimeUndefined)operator(()ident(undefs)operator(\)) + keyword(case) predefined_type(Right)operator(()ident(x)operator(\)) operator(=)operator(>) ident(x) + operator(}) + + directive(private)operator([)local_variable(this)operator(]) keyword(lazy) keyword(val) ident(getValidated) operator(=) + keyword(new) operator(()ident(ValidatedInit) operator(~)operator(>) ident(Initialize)operator(\)) operator({) keyword(def) ident(apply)operator([)ident(T)operator(])operator(()ident(v)operator(:) ident(ValidatedInit)operator([)ident(T)operator(])operator(\)) operator(=) ident(handleUndefined)operator([)ident(T)operator(])operator(()ident(v)operator(\)) operator(}) + + comment(// mainly for reducing generated class count) + directive(private)operator([)local_variable(this)operator(]) keyword(def) ident(validateKeyReferencedT)operator(()ident(g)operator(:) ident(ValidateKeyRef)operator(\)) operator(=) + keyword(new) operator(()ident(Initialize) operator(~)operator(>) ident(ValidatedInit)operator(\)) operator({) keyword(def) ident(apply)operator([)ident(T)operator(])operator(()ident(i)operator(:) ident(Initialize)operator([)ident(T)operator(])operator(\)) operator(=) ident(i) ident(validateKeyReferenced) ident(g) operator(}) + + directive(private)operator([)local_variable(this)operator(]) keyword(def) ident(mapReferencedT)operator(()ident(g)operator(:) ident(MapScoped)operator(\)) operator(=) + keyword(new) operator(()ident(Initialize) operator(~)operator(>) ident(Initialize)operator(\)) operator({) keyword(def) ident(apply)operator([)ident(T)operator(])operator(()ident(i)operator(:) ident(Initialize)operator([)ident(T)operator(])operator(\)) operator(=) ident(i) ident(mapReferenced) ident(g) operator(}) + + directive(private)operator([)local_variable(this)operator(]) keyword(def) ident(mapConstantT)operator(()ident(g)operator(:) ident(MapConstant)operator(\)) operator(=) + keyword(new) operator(()ident(Initialize) operator(~)operator(>) ident(Initialize)operator(\)) operator({) keyword(def) ident(apply)operator([)ident(T)operator(])operator(()ident(i)operator(:) ident(Initialize)operator([)ident(T)operator(])operator(\)) operator(=) ident(i) ident(mapConstant) ident(g) operator(}) + + directive(private)operator([)local_variable(this)operator(]) keyword(def) ident(evaluateT)operator(()ident(g)operator(:) ident(Settings)operator([)ident(Scope)operator(])operator(\)) operator(=) + keyword(new) operator(()ident(Initialize) operator(~)operator(>) ident(Id)operator(\)) operator({) keyword(def) ident(apply)operator([)ident(T)operator(])operator(()ident(i)operator(:) ident(Initialize)operator([)ident(T)operator(])operator(\)) operator(=) ident(i) ident(evaluate) ident(g) operator(}) + + directive(private)operator([)local_variable(this)operator(]) keyword(def) ident(deps)operator(()ident(ls)operator(:) predefined_type(Seq)operator([)ident(Initialize)operator([)ident(_)operator(])operator(])operator(\))operator(:) predefined_type(Seq)operator([)ident(ScopedKey)operator([)ident(_)operator(])operator(]) operator(=) ident(ls)operator(.)ident(flatMap)operator(()ident(_)operator(.)ident(dependencies)operator(\)) + + keyword(sealed) keyword(trait) class(Keyed)operator([)ident(S)operator(,) ident(T)operator(]) directive(extends) ident(Initialize)operator([)ident(T)operator(]) operator({) + keyword(def) ident(scopedKey)operator(:) ident(ScopedKey)operator([)ident(S)operator(]) + keyword(def) ident(transform)operator(:) ident(S) operator(=)operator(>) ident(T) + directive(final) keyword(def) ident(dependencies) operator(=) ident(scopedKey) operator(:)operator(:) predefined_type(Nil) + directive(final) keyword(def) ident(apply)operator([)ident(Z)operator(])operator(()ident(g)operator(:) ident(T) operator(=)operator(>) ident(Z)operator(\))operator(:) ident(Initialize)operator([)ident(Z)operator(]) operator(=) keyword(new) ident(GetValue)operator(()ident(scopedKey)operator(,) ident(g) ident(compose) ident(transform)operator(\)) + directive(final) keyword(def) ident(evaluate)operator(()ident(ss)operator(:) ident(Settings)operator([)ident(Scope)operator(])operator(\))operator(:) ident(T) operator(=) ident(transform)operator(()ident(getValue)operator(()ident(ss)operator(,) ident(scopedKey)operator(\))operator(\)) + directive(final) keyword(def) ident(mapReferenced)operator(()ident(g)operator(:) ident(MapScoped)operator(\))operator(:) ident(Initialize)operator([)ident(T)operator(]) operator(=) keyword(new) ident(GetValue)operator(()ident(g)operator(()ident(scopedKey)operator(\))operator(,) ident(transform)operator(\)) + directive(private)operator([)ident(sbt)operator(]) directive(final) keyword(def) ident(validateKeyReferenced)operator(()ident(g)operator(:) ident(ValidateKeyRef)operator(\))operator(:) ident(ValidatedInit)operator([)ident(T)operator(]) operator(=) ident(g)operator(()ident(scopedKey)operator(,) predefined_constant(false)operator(\)) keyword(match) operator({) + keyword(case) predefined_type(Left)operator(()ident(un)operator(\)) operator(=)operator(>) predefined_type(Left)operator(()ident(un) operator(:)operator(:) predefined_type(Nil)operator(\)) + keyword(case) predefined_type(Right)operator(()ident(nk)operator(\)) operator(=)operator(>) predefined_type(Right)operator(()keyword(new) ident(GetValue)operator(()ident(nk)operator(,) ident(transform)operator(\))operator(\)) + operator(}) + directive(final) keyword(def) ident(mapConstant)operator(()ident(g)operator(:) ident(MapConstant)operator(\))operator(:) ident(Initialize)operator([)ident(T)operator(]) operator(=) ident(g)operator(()ident(scopedKey)operator(\)) keyword(match) operator({) + keyword(case) predefined_type(None) operator(=)operator(>) local_variable(this) + keyword(case) predefined_type(Some)operator(()reserved(const)operator(\)) operator(=)operator(>) keyword(new) ident(Value)operator(()operator(()operator(\)) operator(=)operator(>) ident(transform)operator(()reserved(const)operator(\))operator(\)) + operator(}) + directive(private)operator([)ident(sbt)operator(]) keyword(def) ident(processAttributes)operator([)ident(S)operator(])operator(()ident(init)operator(:) ident(S)operator(\))operator(()ident(f)operator(:) operator(()ident(S)operator(,) ident(AttributeMap)operator(\)) operator(=)operator(>) ident(S)operator(\))operator(:) ident(S) operator(=) ident(init) + operator(}) + directive(private)operator([)local_variable(this)operator(]) directive(final) type(class) class(GetValue)operator([)ident(S)operator(,) ident(T)operator(])operator(()keyword(val) ident(scopedKey)operator(:) ident(ScopedKey)operator([)ident(S)operator(])operator(,) keyword(val) ident(transform)operator(:) ident(S) operator(=)operator(>) ident(T)operator(\)) directive(extends) ident(Keyed)operator([)ident(S)operator(,) ident(T)operator(]) + keyword(trait) class(KeyedInitialize)operator([)ident(T)operator(]) directive(extends) ident(Keyed)operator([)ident(T)operator(,) ident(T)operator(]) operator({) + directive(final) keyword(val) ident(transform) operator(=) ident(idFun)operator([)ident(T)operator(]) + operator(}) + + directive(private)operator([)ident(sbt)operator(]) directive(final) type(class) class(TransformCapture)operator(()keyword(val) ident(f)operator(:) ident(Initialize) operator(~)operator(>) ident(Initialize)operator(\)) directive(extends) ident(Initialize)operator([)ident(Initialize) operator(~)operator(>) ident(Initialize)operator(]) operator({) + keyword(def) ident(dependencies) operator(=) predefined_type(Nil) + keyword(def) ident(apply)operator([)ident(Z)operator(])operator(()ident(g2)operator(:) operator(()ident(Initialize) operator(~)operator(>) ident(Initialize)operator(\)) operator(=)operator(>) ident(Z)operator(\))operator(:) ident(Initialize)operator([)ident(Z)operator(]) operator(=) ident(map)operator(()local_variable(this)operator(\))operator(()ident(g2)operator(\)) + keyword(def) ident(evaluate)operator(()ident(ss)operator(:) ident(Settings)operator([)ident(Scope)operator(])operator(\))operator(:) ident(Initialize) operator(~)operator(>) ident(Initialize) operator(=) ident(f) + keyword(def) ident(mapReferenced)operator(()ident(g)operator(:) ident(MapScoped)operator(\)) operator(=) keyword(new) ident(TransformCapture)operator(()ident(mapReferencedT)operator(()ident(g)operator(\)) error(∙) ident(f)operator(\)) + keyword(def) ident(mapConstant)operator(()ident(g)operator(:) ident(MapConstant)operator(\)) operator(=) keyword(new) ident(TransformCapture)operator(()ident(mapConstantT)operator(()ident(g)operator(\)) error(∙) ident(f)operator(\)) + keyword(def) ident(validateKeyReferenced)operator(()ident(g)operator(:) ident(ValidateKeyRef)operator(\)) operator(=) predefined_type(Right)operator(()keyword(new) ident(TransformCapture)operator(()ident(getValidated) error(∙) ident(validateKeyReferencedT)operator(()ident(g)operator(\)) error(∙) ident(f)operator(\))operator(\)) + directive(private)operator([)ident(sbt)operator(]) keyword(def) ident(processAttributes)operator([)ident(S)operator(])operator(()ident(init)operator(:) ident(S)operator(\))operator(()ident(f)operator(:) operator(()ident(S)operator(,) ident(AttributeMap)operator(\)) operator(=)operator(>) ident(S)operator(\))operator(:) ident(S) operator(=) ident(init) + operator(}) + directive(private)operator([)ident(sbt)operator(]) directive(final) type(class) class(ValidationCapture)operator([)ident(T)operator(])operator(()keyword(val) ident(key)operator(:) ident(ScopedKey)operator([)ident(T)operator(])operator(,) keyword(val) ident(selfRefOk)operator(:) predefined_type(Boolean)operator(\)) directive(extends) ident(Initialize)operator([)ident(ScopedKey)operator([)ident(T)operator(])operator(]) operator({) + keyword(def) ident(dependencies) operator(=) predefined_type(Nil) + keyword(def) ident(apply)operator([)ident(Z)operator(])operator(()ident(g2)operator(:) ident(ScopedKey)operator([)ident(T)operator(]) operator(=)operator(>) ident(Z)operator(\))operator(:) ident(Initialize)operator([)ident(Z)operator(]) operator(=) ident(map)operator(()local_variable(this)operator(\))operator(()ident(g2)operator(\)) + keyword(def) ident(evaluate)operator(()ident(ss)operator(:) ident(Settings)operator([)ident(Scope)operator(])operator(\)) operator(=) ident(key) + keyword(def) ident(mapReferenced)operator(()ident(g)operator(:) ident(MapScoped)operator(\)) operator(=) keyword(new) ident(ValidationCapture)operator(()ident(g)operator(()ident(key)operator(\))operator(,) ident(selfRefOk)operator(\)) + keyword(def) ident(mapConstant)operator(()ident(g)operator(:) ident(MapConstant)operator(\)) operator(=) local_variable(this) + keyword(def) ident(validateKeyReferenced)operator(()ident(g)operator(:) ident(ValidateKeyRef)operator(\)) operator(=) ident(g)operator(()ident(key)operator(,) ident(selfRefOk)operator(\)) keyword(match) operator({) + keyword(case) predefined_type(Left)operator(()ident(un)operator(\)) operator(=)operator(>) predefined_type(Left)operator(()ident(un) operator(:)operator(:) predefined_type(Nil)operator(\)) + keyword(case) predefined_type(Right)operator(()ident(k)operator(\)) operator(=)operator(>) predefined_type(Right)operator(()keyword(new) ident(ValidationCapture)operator(()ident(k)operator(,) ident(selfRefOk)operator(\))operator(\)) + operator(}) + + directive(private)operator([)ident(sbt)operator(]) keyword(def) ident(processAttributes)operator([)ident(S)operator(])operator(()ident(init)operator(:) ident(S)operator(\))operator(()ident(f)operator(:) operator(()ident(S)operator(,) ident(AttributeMap)operator(\)) operator(=)operator(>) ident(S)operator(\))operator(:) ident(S) operator(=) ident(init) + operator(}) + directive(private)operator([)ident(sbt)operator(]) directive(final) type(class) class(Bind)operator([)ident(S)operator(,) ident(T)operator(])operator(()keyword(val) ident(f)operator(:) ident(S) operator(=)operator(>) ident(Initialize)operator([)ident(T)operator(])operator(,) keyword(val) ident(in)operator(:) ident(Initialize)operator([)ident(S)operator(])operator(\)) directive(extends) ident(Initialize)operator([)ident(T)operator(]) operator({) + keyword(def) ident(dependencies) operator(=) ident(in)operator(.)ident(dependencies) + keyword(def) ident(apply)operator([)ident(Z)operator(])operator(()ident(g)operator(:) ident(T) operator(=)operator(>) ident(Z)operator(\))operator(:) ident(Initialize)operator([)ident(Z)operator(]) operator(=) keyword(new) ident(Bind)operator([)ident(S)operator(,) ident(Z)operator(])operator(()ident(s) operator(=)operator(>) ident(f)operator(()ident(s)operator(\))operator(()ident(g)operator(\))operator(,) ident(in)operator(\)) + keyword(def) ident(evaluate)operator(()ident(ss)operator(:) ident(Settings)operator([)ident(Scope)operator(])operator(\))operator(:) ident(T) operator(=) ident(f)operator(()ident(in) ident(evaluate) ident(ss)operator(\)) ident(evaluate) ident(ss) + keyword(def) ident(mapReferenced)operator(()ident(g)operator(:) ident(MapScoped)operator(\)) operator(=) keyword(new) ident(Bind)operator([)ident(S)operator(,) ident(T)operator(])operator(()ident(s) operator(=)operator(>) ident(f)operator(()ident(s)operator(\)) ident(mapReferenced) ident(g)operator(,) ident(in) ident(mapReferenced) ident(g)operator(\)) + keyword(def) ident(validateKeyReferenced)operator(()ident(g)operator(:) ident(ValidateKeyRef)operator(\)) operator(=) operator(()ident(in) ident(validateKeyReferenced) ident(g)operator(\))operator(.)ident(right)operator(.)ident(map) operator({) ident(validIn) operator(=)operator(>) + keyword(new) ident(Bind)operator([)ident(S)operator(,) ident(T)operator(])operator(()ident(s) operator(=)operator(>) ident(handleUndefined)operator(()ident(f)operator(()ident(s)operator(\)) ident(validateKeyReferenced) ident(g)operator(\))operator(,) ident(validIn)operator(\)) + operator(}) + keyword(def) ident(mapConstant)operator(()ident(g)operator(:) ident(MapConstant)operator(\)) operator(=) keyword(new) ident(Bind)operator([)ident(S)operator(,) ident(T)operator(])operator(()ident(s) operator(=)operator(>) ident(f)operator(()ident(s)operator(\)) ident(mapConstant) ident(g)operator(,) ident(in) ident(mapConstant) ident(g)operator(\)) + directive(private)operator([)ident(sbt)operator(]) keyword(def) ident(processAttributes)operator([)ident(S)operator(])operator(()ident(init)operator(:) ident(S)operator(\))operator(()ident(f)operator(:) operator(()ident(S)operator(,) ident(AttributeMap)operator(\)) operator(=)operator(>) ident(S)operator(\))operator(:) ident(S) operator(=) ident(in)operator(.)ident(processAttributes)operator(()ident(init)operator(\))operator(()ident(f)operator(\)) + operator(}) + directive(private)operator([)ident(sbt)operator(]) directive(final) type(class) class(Optional)operator([)ident(S)operator(,) ident(T)operator(])operator(()keyword(val) ident(a)operator(:) predefined_type(Option)operator([)ident(Initialize)operator([)ident(S)operator(])operator(])operator(,) keyword(val) ident(f)operator(:) predefined_type(Option)operator([)ident(S)operator(]) operator(=)operator(>) ident(T)operator(\)) directive(extends) ident(Initialize)operator([)ident(T)operator(]) operator({) + keyword(def) ident(dependencies) operator(=) ident(deps)operator(()ident(a)operator(.)ident(toList)operator(\)) + keyword(def) ident(apply)operator([)ident(Z)operator(])operator(()ident(g)operator(:) ident(T) operator(=)operator(>) ident(Z)operator(\))operator(:) ident(Initialize)operator([)ident(Z)operator(]) operator(=) keyword(new) ident(Optional)operator([)ident(S)operator(,) ident(Z)operator(])operator(()ident(a)operator(,) ident(g) ident(compose) ident(f)operator(\)) + keyword(def) ident(mapReferenced)operator(()ident(g)operator(:) ident(MapScoped)operator(\)) operator(=) keyword(new) ident(Optional)operator(()ident(a) ident(map) ident(mapReferencedT)operator(()ident(g)operator(\))operator(.)ident(fn)operator(,) ident(f)operator(\)) + keyword(def) ident(validateKeyReferenced)operator(()ident(g)operator(:) ident(ValidateKeyRef)operator(\)) operator(=) ident(a) keyword(match) operator({) + keyword(case) predefined_type(None) operator(=)operator(>) predefined_type(Right)operator(()local_variable(this)operator(\)) + keyword(case) predefined_type(Some)operator(()ident(i)operator(\)) operator(=)operator(>) predefined_type(Right)operator(()keyword(new) ident(Optional)operator(()ident(i)operator(.)ident(validateKeyReferenced)operator(()ident(g)operator(\))operator(.)ident(right)operator(.)ident(toOption)operator(,) ident(f)operator(\))operator(\)) + operator(}) + keyword(def) ident(mapConstant)operator(()ident(g)operator(:) ident(MapConstant)operator(\))operator(:) ident(Initialize)operator([)ident(T)operator(]) operator(=) keyword(new) ident(Optional)operator(()ident(a) ident(map) ident(mapConstantT)operator(()ident(g)operator(\))operator(.)ident(fn)operator(,) ident(f)operator(\)) + keyword(def) ident(evaluate)operator(()ident(ss)operator(:) ident(Settings)operator([)ident(Scope)operator(])operator(\))operator(:) ident(T) operator(=) ident(f)operator(()ident(a)operator(.)ident(flatMap)operator(()ident(i) operator(=)operator(>) ident(trapBadRef)operator(()ident(evaluateT)operator(()ident(ss)operator(\))operator(()ident(i)operator(\))operator(\))operator(\))operator(\)) + comment(// proper solution is for evaluate to be deprecated or for external use only and a new internal method returning Either be used) + directive(private)operator([)local_variable(this)operator(]) keyword(def) ident(trapBadRef)operator([)ident(A)operator(])operator(()ident(run)operator(:) operator(=)operator(>) ident(A)operator(\))operator(:) predefined_type(Option)operator([)ident(A)operator(]) operator(=) keyword(try) predefined_type(Some)operator(()ident(run)operator(\)) keyword(catch) operator({) keyword(case) ident(e)operator(:) ident(InvalidReference) operator(=)operator(>) predefined_type(None) operator(}) + directive(private)operator([)ident(sbt)operator(]) keyword(def) ident(processAttributes)operator([)ident(S)operator(])operator(()ident(init)operator(:) ident(S)operator(\))operator(()ident(f)operator(:) operator(()ident(S)operator(,) ident(AttributeMap)operator(\)) operator(=)operator(>) ident(S)operator(\))operator(:) ident(S) operator(=) ident(a) keyword(match) operator({) + keyword(case) predefined_type(None) operator(=)operator(>) ident(init) + keyword(case) predefined_type(Some)operator(()ident(i)operator(\)) operator(=)operator(>) ident(i)operator(.)ident(processAttributes)operator(()ident(init)operator(\))operator(()ident(f)operator(\)) + operator(}) + operator(}) + directive(private)operator([)ident(sbt)operator(]) directive(final) type(class) class(Value)operator([)ident(T)operator(])operator(()keyword(val) ident(value)operator(:) operator(()operator(\)) operator(=)operator(>) ident(T)operator(\)) directive(extends) ident(Initialize)operator([)ident(T)operator(]) operator({) + keyword(def) ident(dependencies) operator(=) predefined_type(Nil) + keyword(def) ident(mapReferenced)operator(()ident(g)operator(:) ident(MapScoped)operator(\)) operator(=) local_variable(this) + keyword(def) ident(validateKeyReferenced)operator(()ident(g)operator(:) ident(ValidateKeyRef)operator(\)) operator(=) predefined_type(Right)operator(()local_variable(this)operator(\)) + keyword(def) ident(apply)operator([)ident(S)operator(])operator(()ident(g)operator(:) ident(T) operator(=)operator(>) ident(S)operator(\)) operator(=) keyword(new) ident(Value)operator([)ident(S)operator(])operator(()operator(()operator(\)) operator(=)operator(>) ident(g)operator(()ident(value)operator(()operator(\))operator(\))operator(\)) + keyword(def) ident(mapConstant)operator(()ident(g)operator(:) ident(MapConstant)operator(\)) operator(=) local_variable(this) + keyword(def) ident(evaluate)operator(()ident(map)operator(:) ident(Settings)operator([)ident(Scope)operator(])operator(\))operator(:) ident(T) operator(=) ident(value)operator(()operator(\)) + directive(private)operator([)ident(sbt)operator(]) keyword(def) ident(processAttributes)operator([)ident(S)operator(])operator(()ident(init)operator(:) ident(S)operator(\))operator(()ident(f)operator(:) operator(()ident(S)operator(,) ident(AttributeMap)operator(\)) operator(=)operator(>) ident(S)operator(\))operator(:) ident(S) operator(=) ident(init) + operator(}) + directive(private)operator([)ident(sbt)operator(]) directive(final) keyword(object) ident(StaticScopes) directive(extends) ident(Initialize)operator([)predefined_type(Set)operator([)ident(Scope)operator(])operator(]) operator({) + keyword(def) ident(dependencies) operator(=) predefined_type(Nil) + keyword(def) ident(mapReferenced)operator(()ident(g)operator(:) ident(MapScoped)operator(\)) operator(=) local_variable(this) + keyword(def) ident(validateKeyReferenced)operator(()ident(g)operator(:) ident(ValidateKeyRef)operator(\)) operator(=) predefined_type(Right)operator(()local_variable(this)operator(\)) + keyword(def) ident(apply)operator([)ident(S)operator(])operator(()ident(g)operator(:) predefined_type(Set)operator([)ident(Scope)operator(]) operator(=)operator(>) ident(S)operator(\)) operator(=) ident(map)operator(()local_variable(this)operator(\))operator(()ident(g)operator(\)) + keyword(def) ident(mapConstant)operator(()ident(g)operator(:) ident(MapConstant)operator(\)) operator(=) local_variable(this) + keyword(def) ident(evaluate)operator(()ident(map)operator(:) ident(Settings)operator([)ident(Scope)operator(])operator(\)) operator(=) ident(map)operator(.)ident(scopes) + directive(private)operator([)ident(sbt)operator(]) keyword(def) ident(processAttributes)operator([)ident(S)operator(])operator(()ident(init)operator(:) ident(S)operator(\))operator(()ident(f)operator(:) operator(()ident(S)operator(,) ident(AttributeMap)operator(\)) operator(=)operator(>) ident(S)operator(\))operator(:) ident(S) operator(=) ident(init) + operator(}) + directive(private)operator([)ident(sbt)operator(]) directive(final) type(class) class(Apply)operator([)ident(K)operator([)ident(L)operator([)ident(x)operator(])operator(])operator(,) ident(T)operator(])operator(()keyword(val) ident(f)operator(:) ident(K)operator([)ident(Id)operator(]) operator(=)operator(>) ident(T)operator(,) keyword(val) ident(inputs)operator(:) ident(K)operator([)ident(Initialize)operator(])operator(,) keyword(val) ident(alist)operator(:) ident(AList)operator([)ident(K)operator(])operator(\)) directive(extends) ident(Initialize)operator([)ident(T)operator(]) operator({) + keyword(def) ident(dependencies) operator(=) ident(deps)operator(()ident(alist)operator(.)ident(toList)operator(()ident(inputs)operator(\))operator(\)) + keyword(def) ident(mapReferenced)operator(()ident(g)operator(:) ident(MapScoped)operator(\)) operator(=) ident(mapInputs)operator(()ident(mapReferencedT)operator(()ident(g)operator(\))operator(\)) + keyword(def) ident(apply)operator([)ident(S)operator(])operator(()ident(g)operator(:) ident(T) operator(=)operator(>) ident(S)operator(\)) operator(=) keyword(new) ident(Apply)operator(()ident(g) ident(compose) ident(f)operator(,) ident(inputs)operator(,) ident(alist)operator(\)) + keyword(def) ident(mapConstant)operator(()ident(g)operator(:) ident(MapConstant)operator(\)) operator(=) ident(mapInputs)operator(()ident(mapConstantT)operator(()ident(g)operator(\))operator(\)) + keyword(def) ident(mapInputs)operator(()ident(g)operator(:) ident(Initialize) operator(~)operator(>) ident(Initialize)operator(\))operator(:) ident(Initialize)operator([)ident(T)operator(]) operator(=) keyword(new) ident(Apply)operator(()ident(f)operator(,) ident(alist)operator(.)ident(transform)operator(()ident(inputs)operator(,) ident(g)operator(\))operator(,) ident(alist)operator(\)) + keyword(def) ident(evaluate)operator(()ident(ss)operator(:) ident(Settings)operator([)ident(Scope)operator(])operator(\)) operator(=) ident(f)operator(()ident(alist)operator(.)ident(transform)operator(()ident(inputs)operator(,) ident(evaluateT)operator(()ident(ss)operator(\))operator(\))operator(\)) + keyword(def) ident(validateKeyReferenced)operator(()ident(g)operator(:) ident(ValidateKeyRef)operator(\)) operator(=) + operator({) + keyword(val) ident(tx) operator(=) ident(alist)operator(.)ident(transform)operator(()ident(inputs)operator(,) ident(validateKeyReferencedT)operator(()ident(g)operator(\))operator(\)) + keyword(val) ident(undefs) operator(=) ident(alist)operator(.)ident(toList)operator(()ident(tx)operator(\))operator(.)ident(flatMap)operator(()ident(_)operator(.)ident(left)operator(.)ident(toSeq)operator(.)ident(flatten)operator(\)) + keyword(val) ident(get) operator(=) keyword(new) operator(()ident(ValidatedInit) operator(~)operator(>) ident(Initialize)operator(\)) operator({) keyword(def) ident(apply)operator([)ident(T)operator(])operator(()ident(vr)operator(:) ident(ValidatedInit)operator([)ident(T)operator(])operator(\)) operator(=) ident(vr)operator(.)ident(right)operator(.)ident(get) operator(}) + keyword(if) operator(()ident(undefs)operator(.)ident(isEmpty)operator(\)) predefined_type(Right)operator(()keyword(new) ident(Apply)operator(()ident(f)operator(,) ident(alist)operator(.)ident(transform)operator(()ident(tx)operator(,) ident(get)operator(\))operator(,) ident(alist)operator(\))operator(\)) keyword(else) predefined_type(Left)operator(()ident(undefs)operator(\)) + operator(}) + + directive(private)operator([)ident(sbt)operator(]) keyword(def) ident(processAttributes)operator([)ident(S)operator(])operator(()ident(init)operator(:) ident(S)operator(\))operator(()ident(f)operator(:) operator(()ident(S)operator(,) ident(AttributeMap)operator(\)) operator(=)operator(>) ident(S)operator(\))operator(:) ident(S) operator(=) + operator(()ident(init) operator(/)operator(:) ident(alist)operator(.)ident(toList)operator(()ident(inputs)operator(\))operator(\)) operator({) operator(()ident(v)operator(,) ident(i)operator(\)) operator(=)operator(>) ident(i)operator(.)ident(processAttributes)operator(()ident(v)operator(\))operator(()ident(f)operator(\)) operator(}) + operator(}) + directive(private) keyword(def) ident(remove)operator([)ident(T)operator(])operator(()ident(s)operator(:) predefined_type(Seq)operator([)ident(T)operator(])operator(,) ident(v)operator(:) ident(T)operator(\)) operator(=) ident(s) ident(filterNot) operator(()ident(_) operator(==) ident(v)operator(\)) +operator(}) diff --git a/scala/sbt.in.scala b/scala/sbt.in.scala new file mode 100644 index 0000000..de7d9a8 --- /dev/null +++ b/scala/sbt.in.scala @@ -0,0 +1,637 @@ +/* sbt -- Simple Build Tool + * Copyright 2011 Mark Harrah + */ +package sbt + +import Types._ + +sealed trait Settings[Scope] { + def data: Map[Scope, AttributeMap] + def keys(scope: Scope): Set[AttributeKey[_]] + def scopes: Set[Scope] + def definingScope(scope: Scope, key: AttributeKey[_]): Option[Scope] + def allKeys[T](f: (Scope, AttributeKey[_]) => T): Seq[T] + def get[T](scope: Scope, key: AttributeKey[T]): Option[T] + def getDirect[T](scope: Scope, key: AttributeKey[T]): Option[T] + def set[T](scope: Scope, key: AttributeKey[T], value: T): Settings[Scope] +} + +private final class Settings0[Scope](val data: Map[Scope, AttributeMap], val delegates: Scope => Seq[Scope]) extends Settings[Scope] { + def scopes: Set[Scope] = data.keySet.toSet + def keys(scope: Scope) = data(scope).keys.toSet + def allKeys[T](f: (Scope, AttributeKey[_]) => T): Seq[T] = data.flatMap { case (scope, map) => map.keys.map(k => f(scope, k)) } toSeq; + + def get[T](scope: Scope, key: AttributeKey[T]): Option[T] = + delegates(scope).toStream.flatMap(sc => getDirect(sc, key)).headOption + def definingScope(scope: Scope, key: AttributeKey[_]): Option[Scope] = + delegates(scope).toStream.filter(sc => getDirect(sc, key).isDefined).headOption + + def getDirect[T](scope: Scope, key: AttributeKey[T]): Option[T] = + (data get scope).flatMap(_ get key) + + def set[T](scope: Scope, key: AttributeKey[T], value: T): Settings[Scope] = + { + val map = (data get scope) getOrElse AttributeMap.empty + val newData = data.updated(scope, map.put(key, value)) + new Settings0(newData, delegates) + } +} +// delegates should contain the input Scope as the first entry +// this trait is intended to be mixed into an object +trait Init[Scope] { + /** The Show instance used when a detailed String needs to be generated. It is typically used when no context is available.*/ + def showFullKey: Show[ScopedKey[_]] + + final case class ScopedKey[T](scope: Scope, key: AttributeKey[T]) extends KeyedInitialize[T] { + def scopedKey = this + } + + type SettingSeq[T] = Seq[Setting[T]] + type ScopedMap = IMap[ScopedKey, SettingSeq] + type CompiledMap = Map[ScopedKey[_], Compiled[_]] + type MapScoped = ScopedKey ~> ScopedKey + type ValidatedRef[T] = Either[Undefined, ScopedKey[T]] + type ValidatedInit[T] = Either[Seq[Undefined], Initialize[T]] + type ValidateRef = ScopedKey ~> ValidatedRef + type ScopeLocal = ScopedKey[_] => Seq[Setting[_]] + type MapConstant = ScopedKey ~> Option + + private[sbt] abstract class ValidateKeyRef { + def apply[T](key: ScopedKey[T], selfRefOk: Boolean): ValidatedRef[T] + } + + /** + * The result of this initialization is the composition of applied transformations. + * This can be useful when dealing with dynamic Initialize values. + */ + lazy val capturedTransformations: Initialize[Initialize ~> Initialize] = new TransformCapture(idK[Initialize]) + + def setting[T](key: ScopedKey[T], init: Initialize[T], pos: SourcePosition = NoPosition): Setting[T] = new Setting[T](key, init, pos) + def valueStrict[T](value: T): Initialize[T] = pure(() => value) + def value[T](value: => T): Initialize[T] = pure(value _) + def pure[T](value: () => T): Initialize[T] = new Value(value) + def optional[T, U](i: Initialize[T])(f: Option[T] => U): Initialize[U] = new Optional(Some(i), f) + def update[T](key: ScopedKey[T])(f: T => T): Setting[T] = setting[T](key, map(key)(f), NoPosition) + def bind[S, T](in: Initialize[S])(f: S => Initialize[T]): Initialize[T] = new Bind(f, in) + def map[S, T](in: Initialize[S])(f: S => T): Initialize[T] = new Apply[({ type l[L[x]] = L[S] })#l, T](f, in, AList.single[S]) + def app[K[L[x]], T](inputs: K[Initialize])(f: K[Id] => T)(implicit alist: AList[K]): Initialize[T] = new Apply[K, T](f, inputs, alist) + def uniform[S, T](inputs: Seq[Initialize[S]])(f: Seq[S] => T): Initialize[T] = + new Apply[({ type l[L[x]] = List[L[S]] })#l, T](f, inputs.toList, AList.seq[S]) + + /** + * The result of this initialization is the validated `key`. + * No dependency is introduced on `key`. If `selfRefOk` is true, validation will not fail if the key is referenced by a definition of `key`. + * That is, key := f(validated(key).value) is allowed only if `selfRefOk == true`. + */ + private[sbt] final def validated[T](key: ScopedKey[T], selfRefOk: Boolean): ValidationCapture[T] = new ValidationCapture(key, selfRefOk) + + @deprecated("0.13.7", "Use the version with default arguments and default paramter.") + final def derive[T](s: Setting[T], allowDynamic: Boolean, filter: Scope => Boolean, trigger: AttributeKey[_] => Boolean): Setting[T] = + derive(s, allowDynamic, filter, trigger, false) + /** + * Constructs a derived setting that will be automatically defined in every scope where one of its dependencies + * is explicitly defined and the where the scope matches `filter`. + * A setting initialized with dynamic dependencies is only allowed if `allowDynamic` is true. + * Only the static dependencies are tracked, however. Dependencies on previous values do not introduce a derived setting either. + */ + final def derive[T](s: Setting[T], allowDynamic: Boolean = false, filter: Scope => Boolean = const(true), trigger: AttributeKey[_] => Boolean = const(true), default: Boolean = false): Setting[T] = { + deriveAllowed(s, allowDynamic) foreach sys.error + val d = new DerivedSetting[T](s.key, s.init, s.pos, filter, trigger) + if (default) d.default() else d + } + def deriveAllowed[T](s: Setting[T], allowDynamic: Boolean): Option[String] = s.init match { + case _: Bind[_, _] if !allowDynamic => Some("Cannot derive from dynamic dependencies.") + case _ => None + } + // id is used for equality + private[sbt] final def defaultSetting[T](s: Setting[T]): Setting[T] = s.default() + private[sbt] def defaultSettings(ss: Seq[Setting[_]]): Seq[Setting[_]] = ss.map(s => defaultSetting(s)) + private[this] final val nextID = new java.util.concurrent.atomic.AtomicLong + private[this] final def nextDefaultID(): Long = nextID.incrementAndGet() + + def empty(implicit delegates: Scope => Seq[Scope]): Settings[Scope] = new Settings0(Map.empty, delegates) + def asTransform(s: Settings[Scope]): ScopedKey ~> Id = new (ScopedKey ~> Id) { + def apply[T](k: ScopedKey[T]): T = getValue(s, k) + } + def getValue[T](s: Settings[Scope], k: ScopedKey[T]) = s.get(k.scope, k.key) getOrElse (throw new InvalidReference(k)) + def asFunction[T](s: Settings[Scope]): ScopedKey[T] => T = k => getValue(s, k) + def mapScope(f: Scope => Scope): MapScoped = new MapScoped { + def apply[T](k: ScopedKey[T]): ScopedKey[T] = k.copy(scope = f(k.scope)) + } + private final class InvalidReference(val key: ScopedKey[_]) extends RuntimeException("Internal settings error: invalid reference to " + showFullKey(key)) + + private[this] def applyDefaults(ss: Seq[Setting[_]]): Seq[Setting[_]] = + { + val (defaults, others) = Util.separate[Setting[_], DefaultSetting[_], Setting[_]](ss) { case u: DefaultSetting[_] => Left(u); case s => Right(s) } + defaults.distinct ++ others + } + + def compiled(init: Seq[Setting[_]], actual: Boolean = true)(implicit delegates: Scope => Seq[Scope], scopeLocal: ScopeLocal, display: Show[ScopedKey[_]]): CompiledMap = + { + val initDefaults = applyDefaults(init) + // inject derived settings into scopes where their dependencies are directly defined + // and prepend per-scope settings + val derived = deriveAndLocal(initDefaults) + // group by Scope/Key, dropping dead initializations + val sMap: ScopedMap = grouped(derived) + // delegate references to undefined values according to 'delegates' + val dMap: ScopedMap = if (actual) delegate(sMap)(delegates, display) else sMap + // merge Seq[Setting[_]] into Compiled + compile(dMap) + } + def make(init: Seq[Setting[_]])(implicit delegates: Scope => Seq[Scope], scopeLocal: ScopeLocal, display: Show[ScopedKey[_]]): Settings[Scope] = + { + val cMap = compiled(init)(delegates, scopeLocal, display) + // order the initializations. cyclic references are detected here. + val ordered: Seq[Compiled[_]] = sort(cMap) + // evaluation: apply the initializations. + try { applyInits(ordered) } + catch { case rru: RuntimeUndefined => throw Uninitialized(cMap.keys.toSeq, delegates, rru.undefined, true) } + } + def sort(cMap: CompiledMap): Seq[Compiled[_]] = + Dag.topologicalSort(cMap.values)(_.dependencies.map(cMap)) + + def compile(sMap: ScopedMap): CompiledMap = + sMap.toTypedSeq.map { + case sMap.TPair(k, ss) => + val deps = ss flatMap { _.dependencies } toSet; + (k, new Compiled(k, deps, ss)) + } toMap; + + def grouped(init: Seq[Setting[_]]): ScopedMap = + ((IMap.empty: ScopedMap) /: init)((m, s) => add(m, s)) + + def add[T](m: ScopedMap, s: Setting[T]): ScopedMap = + m.mapValue[T](s.key, Nil, ss => append(ss, s)) + + def append[T](ss: Seq[Setting[T]], s: Setting[T]): Seq[Setting[T]] = + if (s.definitive) s :: Nil else ss :+ s + + def addLocal(init: Seq[Setting[_]])(implicit scopeLocal: ScopeLocal): Seq[Setting[_]] = + init.flatMap(_.dependencies flatMap scopeLocal) ++ init + + def delegate(sMap: ScopedMap)(implicit delegates: Scope => Seq[Scope], display: Show[ScopedKey[_]]): ScopedMap = + { + def refMap(ref: Setting[_], isFirst: Boolean) = new ValidateKeyRef { + def apply[T](k: ScopedKey[T], selfRefOk: Boolean) = + delegateForKey(sMap, k, delegates(k.scope), ref, selfRefOk || !isFirst) + } + type ValidatedSettings[T] = Either[Seq[Undefined], SettingSeq[T]] + val f = new (SettingSeq ~> ValidatedSettings) { + def apply[T](ks: Seq[Setting[T]]) = { + val (undefs, valid) = Util.separate(ks.zipWithIndex) { case (s, i) => s validateKeyReferenced refMap(s, i == 0) } + if (undefs.isEmpty) Right(valid) else Left(undefs.flatten) + } + } + type Undefs[_] = Seq[Undefined] + val (undefineds, result) = sMap.mapSeparate[Undefs, SettingSeq](f) + if (undefineds.isEmpty) + result + else + throw Uninitialized(sMap.keys.toSeq, delegates, undefineds.values.flatten.toList, false) + } + private[this] def delegateForKey[T](sMap: ScopedMap, k: ScopedKey[T], scopes: Seq[Scope], ref: Setting[_], selfRefOk: Boolean): Either[Undefined, ScopedKey[T]] = + { + val skeys = scopes.iterator.map(x => ScopedKey(x, k.key)) + val definedAt = skeys.find(sk => (selfRefOk || ref.key != sk) && (sMap contains sk)) + definedAt.toRight(Undefined(ref, k)) + } + + private[this] def applyInits(ordered: Seq[Compiled[_]])(implicit delegates: Scope => Seq[Scope]): Settings[Scope] = + { + val x = java.util.concurrent.Executors.newFixedThreadPool(Runtime.getRuntime.availableProcessors) + try { + val eval: EvaluateSettings[Scope] = new EvaluateSettings[Scope] { + override val init: Init.this.type = Init.this + def compiledSettings = ordered + def executor = x + } + eval.run + } finally { x.shutdown() } + } + + def showUndefined(u: Undefined, validKeys: Seq[ScopedKey[_]], delegates: Scope => Seq[Scope])(implicit display: Show[ScopedKey[_]]): String = + { + val guessed = guessIntendedScope(validKeys, delegates, u.referencedKey) + val derived = u.defining.isDerived + val refString = display(u.defining.key) + val sourceString = if (derived) "" else parenPosString(u.defining) + val guessedString = if (derived) "" else guessed.map(g => "\n Did you mean " + display(g) + " ?").toList.mkString + val derivedString = if (derived) ", which is a derived setting that needs this key to be defined in this scope." else "" + display(u.referencedKey) + " from " + refString + sourceString + derivedString + guessedString + } + private[this] def parenPosString(s: Setting[_]): String = + s.positionString match { case None => ""; case Some(s) => " (" + s + ")" } + + def guessIntendedScope(validKeys: Seq[ScopedKey[_]], delegates: Scope => Seq[Scope], key: ScopedKey[_]): Option[ScopedKey[_]] = + { + val distances = validKeys.flatMap { validKey => refinedDistance(delegates, validKey, key).map(dist => (dist, validKey)) } + distances.sortBy(_._1).map(_._2).headOption + } + def refinedDistance(delegates: Scope => Seq[Scope], a: ScopedKey[_], b: ScopedKey[_]): Option[Int] = + if (a.key != b.key || a == b) None + else { + val dist = delegates(a.scope).indexOf(b.scope) + if (dist < 0) None else Some(dist) + } + + final class Uninitialized(val undefined: Seq[Undefined], override val toString: String) extends Exception(toString) + final class Undefined private[sbt] (val defining: Setting[_], val referencedKey: ScopedKey[_]) { + @deprecated("For compatibility only, use `defining` directly.", "0.13.1") + val definingKey = defining.key + @deprecated("For compatibility only, use `defining` directly.", "0.13.1") + val derived: Boolean = defining.isDerived + @deprecated("Use the non-deprecated Undefined factory method.", "0.13.1") + def this(definingKey: ScopedKey[_], referencedKey: ScopedKey[_], derived: Boolean) = this(fakeUndefinedSetting(definingKey, derived), referencedKey) + } + final class RuntimeUndefined(val undefined: Seq[Undefined]) extends RuntimeException("References to undefined settings at runtime.") + + @deprecated("Use the other overload.", "0.13.1") + def Undefined(definingKey: ScopedKey[_], referencedKey: ScopedKey[_], derived: Boolean): Undefined = + new Undefined(fakeUndefinedSetting(definingKey, derived), referencedKey) + private[this] def fakeUndefinedSetting[T](definingKey: ScopedKey[T], d: Boolean): Setting[T] = + { + val init: Initialize[T] = pure(() => sys.error("Dummy setting for compatibility only.")) + new Setting(definingKey, init, NoPosition) { override def isDerived = d } + } + + def Undefined(defining: Setting[_], referencedKey: ScopedKey[_]): Undefined = new Undefined(defining, referencedKey) + def Uninitialized(validKeys: Seq[ScopedKey[_]], delegates: Scope => Seq[Scope], keys: Seq[Undefined], runtime: Boolean)(implicit display: Show[ScopedKey[_]]): Uninitialized = + { + assert(!keys.isEmpty) + val suffix = if (keys.length > 1) "s" else "" + val prefix = if (runtime) "Runtime reference" else "Reference" + val keysString = keys.map(u => showUndefined(u, validKeys, delegates)).mkString("\n\n ", "\n\n ", "") + new Uninitialized(keys, prefix + suffix + " to undefined setting" + suffix + ": " + keysString + "\n ") + } + final class Compiled[T](val key: ScopedKey[T], val dependencies: Iterable[ScopedKey[_]], val settings: Seq[Setting[T]]) { + override def toString = showFullKey(key) + } + final class Flattened(val key: ScopedKey[_], val dependencies: Iterable[ScopedKey[_]]) + + def flattenLocals(compiled: CompiledMap): Map[ScopedKey[_], Flattened] = + { + import collection.breakOut + val locals = compiled flatMap { case (key, comp) => if (key.key.isLocal) Seq[Compiled[_]](comp) else Nil } + val ordered = Dag.topologicalSort(locals)(_.dependencies.flatMap(dep => if (dep.key.isLocal) Seq[Compiled[_]](compiled(dep)) else Nil)) + def flatten(cmap: Map[ScopedKey[_], Flattened], key: ScopedKey[_], deps: Iterable[ScopedKey[_]]): Flattened = + new Flattened(key, deps.flatMap(dep => if (dep.key.isLocal) cmap(dep).dependencies else dep :: Nil)) + + val empty = Map.empty[ScopedKey[_], Flattened] + val flattenedLocals = (empty /: ordered) { (cmap, c) => cmap.updated(c.key, flatten(cmap, c.key, c.dependencies)) } + compiled flatMap { + case (key, comp) => + if (key.key.isLocal) + Nil + else + Seq[(ScopedKey[_], Flattened)]((key, flatten(flattenedLocals, key, comp.dependencies))) + } + } + + def definedAtString(settings: Seq[Setting[_]]): String = + { + val posDefined = settings.flatMap(_.positionString.toList) + if (posDefined.size > 0) { + val header = if (posDefined.size == settings.size) "defined at:" else + "some of the defining occurrences:" + header + (posDefined.distinct mkString ("\n\t", "\n\t", "\n")) + } else "" + } + + /** + * Intersects two scopes, returning the more specific one if they intersect, or None otherwise. + */ + private[sbt] def intersect(s1: Scope, s2: Scope)(implicit delegates: Scope => Seq[Scope]): Option[Scope] = + if (delegates(s1).contains(s2)) Some(s1) // s1 is more specific + else if (delegates(s2).contains(s1)) Some(s2) // s2 is more specific + else None + + private[this] def deriveAndLocal(init: Seq[Setting[_]])(implicit delegates: Scope => Seq[Scope], scopeLocal: ScopeLocal): Seq[Setting[_]] = + { + import collection.mutable + + final class Derived(val setting: DerivedSetting[_]) { + val dependencies = setting.dependencies.map(_.key) + def triggeredBy = dependencies.filter(setting.trigger) + val inScopes = new mutable.HashSet[Scope] + val outputs = new mutable.ListBuffer[Setting[_]] + } + final class Deriveds(val key: AttributeKey[_], val settings: mutable.ListBuffer[Derived]) { + def dependencies = settings.flatMap(_.dependencies) + // This is mainly for use in the cyclic reference error message + override def toString = s"Derived settings for ${key.label}, ${definedAtString(settings.map(_.setting))}" + } + + // separate `derived` settings from normal settings (`defs`) + val (derived, rawDefs) = Util.separate[Setting[_], Derived, Setting[_]](init) { case d: DerivedSetting[_] => Left(new Derived(d)); case s => Right(s) } + val defs = addLocal(rawDefs)(scopeLocal) + + // group derived settings by the key they define + val derivsByDef = new mutable.HashMap[AttributeKey[_], Deriveds] + for (s <- derived) { + val key = s.setting.key.key + derivsByDef.getOrElseUpdate(key, new Deriveds(key, new mutable.ListBuffer)).settings += s + } + + // sort derived settings so that dependencies come first + // this is necessary when verifying that a derived setting's dependencies exist + val ddeps = (d: Deriveds) => d.dependencies.flatMap(derivsByDef.get) + val sortedDerivs = Dag.topologicalSort(derivsByDef.values)(ddeps) + + // index derived settings by triggering key. This maps a key to the list of settings potentially derived from it. + val derivedBy = new mutable.HashMap[AttributeKey[_], mutable.ListBuffer[Derived]] + for (s <- derived; d <- s.triggeredBy) + derivedBy.getOrElseUpdate(d, new mutable.ListBuffer) += s + + // Map a DerivedSetting[_] to the `Derived` struct wrapping it. Used to ultimately replace a DerivedSetting with + // the `Setting`s that were actually derived from it: `Derived.outputs` + val derivedToStruct: Map[DerivedSetting[_], Derived] = (derived map { s => s.setting -> s }).toMap + + // set of defined scoped keys, used to ensure a derived setting is only added if all dependencies are present + val defined = new mutable.HashSet[ScopedKey[_]] + def addDefs(ss: Seq[Setting[_]]) { for (s <- ss) defined += s.key } + addDefs(defs) + + // true iff the scoped key is in `defined`, taking delegation into account + def isDefined(key: AttributeKey[_], scope: Scope) = + delegates(scope).exists(s => defined.contains(ScopedKey(s, key))) + + // true iff all dependencies of derived setting `d` have a value (potentially via delegation) in `scope` + def allDepsDefined(d: Derived, scope: Scope, local: Set[AttributeKey[_]]): Boolean = + d.dependencies.forall(dep => local(dep) || isDefined(dep, scope)) + + // Returns the list of injectable derived settings and their local settings for `sk`. + // The settings are to be injected under `outputScope` = whichever scope is more specific of: + // * the dependency's (`sk`) scope + // * the DerivedSetting's scope in which it has been declared, `definingScope` + // provided that these two scopes intersect. + // A derived setting is injectable if: + // 1. it has not been previously injected into outputScope + // 2. it applies to outputScope (as determined by its `filter`) + // 3. all of its dependencies are defined for outputScope (allowing for delegation) + // This needs to handle local settings because a derived setting wouldn't be injected if it's local setting didn't exist yet. + val deriveFor = (sk: ScopedKey[_]) => { + val derivedForKey: List[Derived] = derivedBy.get(sk.key).toList.flatten + val scope = sk.scope + def localAndDerived(d: Derived): Seq[Setting[_]] = { + def definingScope = d.setting.key.scope + val outputScope = intersect(scope, definingScope) + outputScope collect { + case s if !d.inScopes.contains(s) && d.setting.filter(s) => + val local = d.dependencies.flatMap(dep => scopeLocal(ScopedKey(s, dep))) + if (allDepsDefined(d, s, local.map(_.key.key).toSet)) { + d.inScopes.add(s) + val out = local :+ d.setting.setScope(s) + d.outputs ++= out + out + } else + Nil + } getOrElse Nil + } + derivedForKey.flatMap(localAndDerived) + } + + val processed = new mutable.HashSet[ScopedKey[_]] + + // derives settings, transitively so that a derived setting can trigger another + def process(rem: List[Setting[_]]): Unit = rem match { + case s :: ss => + val sk = s.key + val ds = if (processed.add(sk)) deriveFor(sk) else Nil + addDefs(ds) + process(ds ::: ss) + case Nil => + } + process(defs.toList) + + // Take all the original defs and DerivedSettings along with locals, replace each DerivedSetting with the actual + // settings that were derived. + val allDefs = addLocal(init)(scopeLocal) + allDefs flatMap { case d: DerivedSetting[_] => (derivedToStruct get d map (_.outputs)).toStream.flatten; case s => Stream(s) } + } + + sealed trait Initialize[T] { + def dependencies: Seq[ScopedKey[_]] + def apply[S](g: T => S): Initialize[S] + + @deprecated("Will be made private.", "0.13.2") + def mapReferenced(g: MapScoped): Initialize[T] + @deprecated("Will be made private.", "0.13.2") + def mapConstant(g: MapConstant): Initialize[T] + + @deprecated("Will be made private.", "0.13.2") + def validateReferenced(g: ValidateRef): ValidatedInit[T] = + validateKeyReferenced(new ValidateKeyRef { def apply[T](key: ScopedKey[T], selfRefOk: Boolean) = g(key) }) + + private[sbt] def validateKeyReferenced(g: ValidateKeyRef): ValidatedInit[T] + + def evaluate(map: Settings[Scope]): T + def zip[S](o: Initialize[S]): Initialize[(T, S)] = zipTupled(o)(idFun) + def zipWith[S, U](o: Initialize[S])(f: (T, S) => U): Initialize[U] = zipTupled(o)(f.tupled) + private[this] def zipTupled[S, U](o: Initialize[S])(f: ((T, S)) => U): Initialize[U] = + new Apply[({ type l[L[x]] = (L[T], L[S]) })#l, U](f, (this, o), AList.tuple2[T, S]) + /** A fold on the static attributes of this and nested Initializes. */ + private[sbt] def processAttributes[S](init: S)(f: (S, AttributeMap) => S): S + } + object Initialize { + implicit def joinInitialize[T](s: Seq[Initialize[T]]): JoinInitSeq[T] = new JoinInitSeq(s) + final class JoinInitSeq[T](s: Seq[Initialize[T]]) { + def joinWith[S](f: Seq[T] => S): Initialize[S] = uniform(s)(f) + def join: Initialize[Seq[T]] = uniform(s)(idFun) + } + def join[T](inits: Seq[Initialize[T]]): Initialize[Seq[T]] = uniform(inits)(idFun) + def joinAny[M[_]](inits: Seq[Initialize[M[T]] forSome { type T }]): Initialize[Seq[M[_]]] = + join(inits.asInstanceOf[Seq[Initialize[M[Any]]]]).asInstanceOf[Initialize[Seq[M[T] forSome { type T }]]] + } + object SettingsDefinition { + implicit def unwrapSettingsDefinition(d: SettingsDefinition): Seq[Setting[_]] = d.settings + implicit def wrapSettingsDefinition(ss: Seq[Setting[_]]): SettingsDefinition = new SettingList(ss) + } + sealed trait SettingsDefinition { + def settings: Seq[Setting[_]] + } + final class SettingList(val settings: Seq[Setting[_]]) extends SettingsDefinition + sealed class Setting[T] private[Init] (val key: ScopedKey[T], val init: Initialize[T], val pos: SourcePosition) extends SettingsDefinition { + def settings = this :: Nil + def definitive: Boolean = !init.dependencies.contains(key) + def dependencies: Seq[ScopedKey[_]] = remove(init.dependencies, key) + @deprecated("Will be made private.", "0.13.2") + def mapReferenced(g: MapScoped): Setting[T] = make(key, init mapReferenced g, pos) + @deprecated("Will be made private.", "0.13.2") + def validateReferenced(g: ValidateRef): Either[Seq[Undefined], Setting[T]] = (init validateReferenced g).right.map(newI => make(key, newI, pos)) + + private[sbt] def validateKeyReferenced(g: ValidateKeyRef): Either[Seq[Undefined], Setting[T]] = + (init validateKeyReferenced g).right.map(newI => make(key, newI, pos)) + + def mapKey(g: MapScoped): Setting[T] = make(g(key), init, pos) + def mapInit(f: (ScopedKey[T], T) => T): Setting[T] = make(key, init(t => f(key, t)), pos) + @deprecated("Will be made private.", "0.13.2") + def mapConstant(g: MapConstant): Setting[T] = make(key, init mapConstant g, pos) + def withPos(pos: SourcePosition) = make(key, init, pos) + def positionString: Option[String] = pos match { + case pos: FilePosition => Some(pos.path + ":" + pos.startLine) + case NoPosition => None + } + private[sbt] def mapInitialize(f: Initialize[T] => Initialize[T]): Setting[T] = make(key, f(init), pos) + override def toString = "setting(" + key + ") at " + pos + + protected[this] def make[T](key: ScopedKey[T], init: Initialize[T], pos: SourcePosition): Setting[T] = new Setting[T](key, init, pos) + protected[sbt] def isDerived: Boolean = false + private[sbt] def setScope(s: Scope): Setting[T] = make(key.copy(scope = s), init.mapReferenced(mapScope(const(s))), pos) + /** Turn this setting into a `DefaultSetting` if it's not already, otherwise returns `this` */ + private[sbt] def default(id: => Long = nextDefaultID()): DefaultSetting[T] = DefaultSetting(key, init, pos, id) + } + private[Init] sealed class DerivedSetting[T](sk: ScopedKey[T], i: Initialize[T], p: SourcePosition, val filter: Scope => Boolean, val trigger: AttributeKey[_] => Boolean) extends Setting[T](sk, i, p) { + override def make[T](key: ScopedKey[T], init: Initialize[T], pos: SourcePosition): Setting[T] = new DerivedSetting[T](key, init, pos, filter, trigger) + protected[sbt] override def isDerived: Boolean = true + override def default(_id: => Long): DefaultSetting[T] = new DerivedSetting[T](sk, i, p, filter, trigger) with DefaultSetting[T] { val id = _id } + override def toString = "derived " + super.toString + } + // Only keep the first occurence of this setting and move it to the front so that it has lower precedence than non-defaults. + // This is intended for internal sbt use only, where alternatives like Plugin.globalSettings are not available. + private[Init] sealed trait DefaultSetting[T] extends Setting[T] { + val id: Long + override def make[T](key: ScopedKey[T], init: Initialize[T], pos: SourcePosition): Setting[T] = super.make(key, init, pos) default id + override final def hashCode = id.hashCode + override final def equals(o: Any): Boolean = o match { case d: DefaultSetting[_] => d.id == id; case _ => false } + override def toString = s"default($id) " + super.toString + override def default(id: => Long) = this + } + + object DefaultSetting { + def apply[T](sk: ScopedKey[T], i: Initialize[T], p: SourcePosition, _id: Long) = new Setting[T](sk, i, p) with DefaultSetting[T] { val id = _id } + } + + private[this] def handleUndefined[T](vr: ValidatedInit[T]): Initialize[T] = vr match { + case Left(undefs) => throw new RuntimeUndefined(undefs) + case Right(x) => x + } + + private[this] lazy val getValidated = + new (ValidatedInit ~> Initialize) { def apply[T](v: ValidatedInit[T]) = handleUndefined[T](v) } + + // mainly for reducing generated class count + private[this] def validateKeyReferencedT(g: ValidateKeyRef) = + new (Initialize ~> ValidatedInit) { def apply[T](i: Initialize[T]) = i validateKeyReferenced g } + + private[this] def mapReferencedT(g: MapScoped) = + new (Initialize ~> Initialize) { def apply[T](i: Initialize[T]) = i mapReferenced g } + + private[this] def mapConstantT(g: MapConstant) = + new (Initialize ~> Initialize) { def apply[T](i: Initialize[T]) = i mapConstant g } + + private[this] def evaluateT(g: Settings[Scope]) = + new (Initialize ~> Id) { def apply[T](i: Initialize[T]) = i evaluate g } + + private[this] def deps(ls: Seq[Initialize[_]]): Seq[ScopedKey[_]] = ls.flatMap(_.dependencies) + + sealed trait Keyed[S, T] extends Initialize[T] { + def scopedKey: ScopedKey[S] + def transform: S => T + final def dependencies = scopedKey :: Nil + final def apply[Z](g: T => Z): Initialize[Z] = new GetValue(scopedKey, g compose transform) + final def evaluate(ss: Settings[Scope]): T = transform(getValue(ss, scopedKey)) + final def mapReferenced(g: MapScoped): Initialize[T] = new GetValue(g(scopedKey), transform) + private[sbt] final def validateKeyReferenced(g: ValidateKeyRef): ValidatedInit[T] = g(scopedKey, false) match { + case Left(un) => Left(un :: Nil) + case Right(nk) => Right(new GetValue(nk, transform)) + } + final def mapConstant(g: MapConstant): Initialize[T] = g(scopedKey) match { + case None => this + case Some(const) => new Value(() => transform(const)) + } + private[sbt] def processAttributes[S](init: S)(f: (S, AttributeMap) => S): S = init + } + private[this] final class GetValue[S, T](val scopedKey: ScopedKey[S], val transform: S => T) extends Keyed[S, T] + trait KeyedInitialize[T] extends Keyed[T, T] { + final val transform = idFun[T] + } + + private[sbt] final class TransformCapture(val f: Initialize ~> Initialize) extends Initialize[Initialize ~> Initialize] { + def dependencies = Nil + def apply[Z](g2: (Initialize ~> Initialize) => Z): Initialize[Z] = map(this)(g2) + def evaluate(ss: Settings[Scope]): Initialize ~> Initialize = f + def mapReferenced(g: MapScoped) = new TransformCapture(mapReferencedT(g) ∙ f) + def mapConstant(g: MapConstant) = new TransformCapture(mapConstantT(g) ∙ f) + def validateKeyReferenced(g: ValidateKeyRef) = Right(new TransformCapture(getValidated ∙ validateKeyReferencedT(g) ∙ f)) + private[sbt] def processAttributes[S](init: S)(f: (S, AttributeMap) => S): S = init + } + private[sbt] final class ValidationCapture[T](val key: ScopedKey[T], val selfRefOk: Boolean) extends Initialize[ScopedKey[T]] { + def dependencies = Nil + def apply[Z](g2: ScopedKey[T] => Z): Initialize[Z] = map(this)(g2) + def evaluate(ss: Settings[Scope]) = key + def mapReferenced(g: MapScoped) = new ValidationCapture(g(key), selfRefOk) + def mapConstant(g: MapConstant) = this + def validateKeyReferenced(g: ValidateKeyRef) = g(key, selfRefOk) match { + case Left(un) => Left(un :: Nil) + case Right(k) => Right(new ValidationCapture(k, selfRefOk)) + } + + private[sbt] def processAttributes[S](init: S)(f: (S, AttributeMap) => S): S = init + } + private[sbt] final class Bind[S, T](val f: S => Initialize[T], val in: Initialize[S]) extends Initialize[T] { + def dependencies = in.dependencies + def apply[Z](g: T => Z): Initialize[Z] = new Bind[S, Z](s => f(s)(g), in) + def evaluate(ss: Settings[Scope]): T = f(in evaluate ss) evaluate ss + def mapReferenced(g: MapScoped) = new Bind[S, T](s => f(s) mapReferenced g, in mapReferenced g) + def validateKeyReferenced(g: ValidateKeyRef) = (in validateKeyReferenced g).right.map { validIn => + new Bind[S, T](s => handleUndefined(f(s) validateKeyReferenced g), validIn) + } + def mapConstant(g: MapConstant) = new Bind[S, T](s => f(s) mapConstant g, in mapConstant g) + private[sbt] def processAttributes[S](init: S)(f: (S, AttributeMap) => S): S = in.processAttributes(init)(f) + } + private[sbt] final class Optional[S, T](val a: Option[Initialize[S]], val f: Option[S] => T) extends Initialize[T] { + def dependencies = deps(a.toList) + def apply[Z](g: T => Z): Initialize[Z] = new Optional[S, Z](a, g compose f) + def mapReferenced(g: MapScoped) = new Optional(a map mapReferencedT(g).fn, f) + def validateKeyReferenced(g: ValidateKeyRef) = a match { + case None => Right(this) + case Some(i) => Right(new Optional(i.validateKeyReferenced(g).right.toOption, f)) + } + def mapConstant(g: MapConstant): Initialize[T] = new Optional(a map mapConstantT(g).fn, f) + def evaluate(ss: Settings[Scope]): T = f(a.flatMap(i => trapBadRef(evaluateT(ss)(i)))) + // proper solution is for evaluate to be deprecated or for external use only and a new internal method returning Either be used + private[this] def trapBadRef[A](run: => A): Option[A] = try Some(run) catch { case e: InvalidReference => None } + private[sbt] def processAttributes[S](init: S)(f: (S, AttributeMap) => S): S = a match { + case None => init + case Some(i) => i.processAttributes(init)(f) + } + } + private[sbt] final class Value[T](val value: () => T) extends Initialize[T] { + def dependencies = Nil + def mapReferenced(g: MapScoped) = this + def validateKeyReferenced(g: ValidateKeyRef) = Right(this) + def apply[S](g: T => S) = new Value[S](() => g(value())) + def mapConstant(g: MapConstant) = this + def evaluate(map: Settings[Scope]): T = value() + private[sbt] def processAttributes[S](init: S)(f: (S, AttributeMap) => S): S = init + } + private[sbt] final object StaticScopes extends Initialize[Set[Scope]] { + def dependencies = Nil + def mapReferenced(g: MapScoped) = this + def validateKeyReferenced(g: ValidateKeyRef) = Right(this) + def apply[S](g: Set[Scope] => S) = map(this)(g) + def mapConstant(g: MapConstant) = this + def evaluate(map: Settings[Scope]) = map.scopes + private[sbt] def processAttributes[S](init: S)(f: (S, AttributeMap) => S): S = init + } + private[sbt] final class Apply[K[L[x]], T](val f: K[Id] => T, val inputs: K[Initialize], val alist: AList[K]) extends Initialize[T] { + def dependencies = deps(alist.toList(inputs)) + def mapReferenced(g: MapScoped) = mapInputs(mapReferencedT(g)) + def apply[S](g: T => S) = new Apply(g compose f, inputs, alist) + def mapConstant(g: MapConstant) = mapInputs(mapConstantT(g)) + def mapInputs(g: Initialize ~> Initialize): Initialize[T] = new Apply(f, alist.transform(inputs, g), alist) + def evaluate(ss: Settings[Scope]) = f(alist.transform(inputs, evaluateT(ss))) + def validateKeyReferenced(g: ValidateKeyRef) = + { + val tx = alist.transform(inputs, validateKeyReferencedT(g)) + val undefs = alist.toList(tx).flatMap(_.left.toSeq.flatten) + val get = new (ValidatedInit ~> Initialize) { def apply[T](vr: ValidatedInit[T]) = vr.right.get } + if (undefs.isEmpty) Right(new Apply(f, alist.transform(tx, get), alist)) else Left(undefs) + } + + private[sbt] def processAttributes[S](init: S)(f: (S, AttributeMap) => S): S = + (init /: alist.toList(inputs)) { (v, i) => i.processAttributes(v)(f) } + } + private def remove[T](s: Seq[T], v: T) = s filterNot (_ == v) +} diff --git a/scala/suite.rb b/scala/suite.rb new file mode 100644 index 0000000..3765c38 --- /dev/null +++ b/scala/suite.rb @@ -0,0 +1,4 @@ +module ScannerTests + class Scala < CodeRay::TestCase + end +end