/* * Copyright 2013-present Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ package com.facebook.buck.apple.xcode.xcodeproj; import com.facebook.buck.apple.xcode.XcodeprojSerializer; import com.google.common.base.CharMatcher; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import javax.annotation.Nullable; /** * Superclass for file, directories, and groups. Xcode's virtual file hierarchy are made of these * objects. */ public class PBXReference extends PBXContainerItem { public enum SourceTree { /** * Relative to the path of the group containing this. */ GROUP("<group>"), /** * Absolute system path. */ ABSOLUTE("<absolute>"), /** * Relative to the build setting {@code BUILT_PRODUCTS_DIR}. */ BUILT_PRODUCTS_DIR("BUILT_PRODUCTS_DIR"), /** * Relative to the build setting {@code SDKROOT}. */ SDKROOT("SDKROOT"), /** * Relative to the directory containing the project file {@code SOURCE_ROOT}. */ SOURCE_ROOT("SOURCE_ROOT"), /** * Relative to the Developer content directory inside the Xcode application * (e.g. {@code /Applications/Xcode.app/Contents/Developer}). */ DEVELOPER_DIR("DEVELOPER_DIR"), ; private final String rep; SourceTree(String str) { rep = str; } @Override public String toString() { return rep; } /** * Return a sourceTree given a build setting that is typically used as a source tree prefix. * * The build setting may be optionally prefixed by '$' which will be stripped. */ public static Optional<SourceTree> fromBuildSetting(String buildSetting) { switch (CharMatcher.is('$').trimLeadingFrom(buildSetting)) { case "BUILT_PRODUCTS_DIR": return Optional.of(BUILT_PRODUCTS_DIR); case "SDKROOT": return Optional.of(SDKROOT); case "SOURCE_ROOT": return Optional.of(SOURCE_ROOT); case "DEVELOPER_DIR": return Optional.of(DEVELOPER_DIR); default: return Optional.absent(); } } } private final String name; @Nullable private String path; /** * The "base" path of the reference. The absolute path is resolved by prepending the resolved * base path. */ private SourceTree sourceTree; public PBXReference(String name, @Nullable String path, SourceTree sourceTree) { this.name = Preconditions.checkNotNull(name); this.path = path; this.sourceTree = Preconditions.checkNotNull(sourceTree); } public String getName() { return name; } @Nullable public String getPath() { return path; } public void setPath(String v) { path = v; } public SourceTree getSourceTree() { return sourceTree; } public void setSourceTree(SourceTree v) { sourceTree = v; } @Override public String isa() { return "PBXReference"; } @Override public int stableHash() { return name.hashCode(); } @Override public void serializeInto(XcodeprojSerializer s) { super.serializeInto(s); s.addField("name", name); if (path != null) { s.addField("path", path); } s.addField("sourceTree", sourceTree.toString()); } @Override public String toString() { return String.format( "%s name=%s path=%s sourceTree=%s", super.toString(), getName(), getPath(), getSourceTree()); } }