Make MODULE_FILE optional
[idea/community.git] / python / src / com / jetbrains / python / documentation / PyDocumentationSettings.java
1 /*
2  * Copyright 2000-2016 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.jetbrains.python.documentation;
17
18 import com.intellij.openapi.components.PersistentStateComponent;
19 import com.intellij.openapi.components.State;
20 import com.intellij.openapi.module.Module;
21 import com.intellij.openapi.module.ModuleServiceManager;
22 import com.intellij.openapi.util.text.StringUtil;
23 import com.intellij.psi.PsiFile;
24 import com.intellij.util.xmlb.XmlSerializerUtil;
25 import com.intellij.util.xmlb.annotations.OptionTag;
26 import com.intellij.util.xmlb.annotations.Transient;
27 import com.jetbrains.python.PyNames;
28 import com.jetbrains.python.documentation.docstrings.DocStringFormat;
29 import com.jetbrains.python.psi.PyFile;
30 import com.jetbrains.python.psi.PyTargetExpression;
31 import com.jetbrains.python.psi.impl.PyPsiUtils;
32 import org.jetbrains.annotations.NotNull;
33 import org.jetbrains.annotations.Nullable;
34
35 import java.util.List;
36
37 /**
38  * @author yole
39  */
40 @State(name = "PyDocumentationSettings")
41 public class PyDocumentationSettings implements PersistentStateComponent<PyDocumentationSettings> {
42   public static final DocStringFormat DEFAULT_DOCSTRING_FORMAT = DocStringFormat.REST;
43
44   public static PyDocumentationSettings getInstance(@NotNull Module module) {
45     return ModuleServiceManager.getService(module, PyDocumentationSettings.class);
46   }
47
48   @NotNull private DocStringFormat myDocStringFormat = DEFAULT_DOCSTRING_FORMAT;
49   private boolean myAnalyzeDoctest = true;
50
51   public boolean isNumpyFormat(PsiFile file) {
52     return isFormat(file, DocStringFormat.NUMPY);
53   }
54
55   public boolean isPlain(PsiFile file) {
56     return isFormat(file, DocStringFormat.PLAIN);
57   }
58
59   private boolean isFormat(@Nullable PsiFile file, @NotNull DocStringFormat format) {
60     return file instanceof PyFile ? getFormatForFile(file) == format : myDocStringFormat == format;
61   }
62
63   @NotNull
64   public DocStringFormat getFormatForFile(@NotNull PsiFile file) {
65     final DocStringFormat fileFormat = getFormatFromDocformatAttribute(file);
66     return fileFormat != null && fileFormat != DocStringFormat.PLAIN ? fileFormat : myDocStringFormat;
67   }
68
69   @Nullable
70   public static DocStringFormat getFormatFromDocformatAttribute(@NotNull PsiFile file) {
71     if (file instanceof PyFile) {
72       final PyTargetExpression expr = ((PyFile)file).findTopLevelAttribute(PyNames.DOCFORMAT);
73       if (expr != null) {
74         final String docformat = PyPsiUtils.strValue(expr.findAssignedValue());
75         if (docformat != null) {
76           final List<String> words = StringUtil.split(docformat, " ");
77           if (words.size() > 0) {
78             final DocStringFormat fileFormat = DocStringFormat.fromName(words.get(0));
79             if (fileFormat != null) {
80               return fileFormat;
81             }
82           }
83         }
84       }
85     }
86     return null;
87   }
88
89   @Transient
90   @NotNull
91   public DocStringFormat getFormat() {
92     return myDocStringFormat;
93   }
94
95   public void setFormat(@NotNull DocStringFormat format) {
96     myDocStringFormat = format;
97   }
98
99   // Legacy name of the field to preserve settings format
100   @SuppressWarnings("unused")
101   @OptionTag("myDocStringFormat")
102   @NotNull
103   public String getFormatName() {
104     return myDocStringFormat.getName();
105   }
106
107   @SuppressWarnings("unused")
108   public void setFormatName(@NotNull String name) {
109     myDocStringFormat = DocStringFormat.fromNameOrPlain(name);
110   }
111
112   public boolean isAnalyzeDoctest() {
113     return myAnalyzeDoctest;
114   }
115
116   public void setAnalyzeDoctest(boolean analyze) {
117     myAnalyzeDoctest = analyze;
118   }
119
120   @Override
121   public PyDocumentationSettings getState() {
122     return this;
123   }
124
125   @Override
126   public void loadState(PyDocumentationSettings state) {
127     XmlSerializerUtil.copyBean(state, this);
128   }
129 }