summaryrefslogtreecommitdiff
path: root/platform/projectModel-impl/src/com/intellij/openapi/components/impl/ProjectPathMacroManager.java
blob: bd97349ca0bb3fd2c18668ace20a1f1749990ba9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.openapi.components.impl;

import com.intellij.application.options.ReplacePathToMacroMap;
import com.intellij.openapi.application.PathMacros;
import com.intellij.openapi.components.ExpandMacroToPathMap;
import com.intellij.openapi.components.PathMacroManager;
import com.intellij.openapi.project.Project;
import com.intellij.serviceContainer.NonInjectable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.SystemIndependent;
import org.jetbrains.jps.model.serialization.PathMacroUtil;

import java.util.function.Supplier;

public class ProjectPathMacroManager extends PathMacroManager {
  private final Supplier<@SystemIndependent String> myBasePathPointer;
  private final @Nullable Supplier<@SystemIndependent String> myNamePointer;

  public ProjectPathMacroManager(@NotNull Project project) {
    super(PathMacros.getInstance());
    myBasePathPointer = project::getBasePath;
    myNamePointer = !project.isDefault() ? project::getName : null;
  }

  @NonInjectable
  private ProjectPathMacroManager(Supplier<@SystemIndependent String> basePathPointer,
                                  @Nullable Supplier<@SystemIndependent String> namePointer) {
    super(PathMacros.getInstance());
    myBasePathPointer = basePathPointer;
    myNamePointer = namePointer;
  }

  @NotNull
  @Override
  public ExpandMacroToPathMap getExpandMacroMap() {
    ExpandMacroToPathMap result = super.getExpandMacroMap();
    addFileHierarchyReplacements(result, PathMacroUtil.PROJECT_DIR_MACRO_NAME, myBasePathPointer.get());
    if (myNamePointer != null) {
      result.addMacroExpand(PathMacroUtil.PROJECT_NAME_MACRO_NAME, myNamePointer.get());
    }
    return result;
  }

  @NotNull
  @Override
  protected ReplacePathToMacroMap computeReplacePathMap() {
    ReplacePathToMacroMap result = super.computeReplacePathMap();
    addFileHierarchyReplacements(result, PathMacroUtil.PROJECT_DIR_MACRO_NAME, myBasePathPointer.get(), null);
    return result;
  }

  public static ProjectPathMacroManager createInstance(Supplier<@SystemIndependent String> basePathPointer,
                                                       @Nullable Supplier<@SystemIndependent String> namePointer) {
    return new ProjectPathMacroManager(basePathPointer, namePointer);
  }
}