avoid offset calculation in case of LightVirtualFile or HttpVirtualFile
[idea/community.git] / platform / xdebugger-impl / src / com / intellij / xdebugger / impl / XSourcePositionImpl.java
1 /*
2  * Copyright 2000-2009 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.intellij.xdebugger.impl;
17
18 import com.intellij.openapi.editor.Document;
19 import com.intellij.openapi.fileEditor.FileDocumentManager;
20 import com.intellij.openapi.fileEditor.OpenFileDescriptor;
21 import com.intellij.openapi.project.Project;
22 import com.intellij.openapi.vfs.VirtualFile;
23 import com.intellij.openapi.vfs.impl.http.HttpVirtualFile;
24 import com.intellij.pom.Navigatable;
25 import com.intellij.testFramework.LightVirtualFile;
26 import com.intellij.xdebugger.XSourcePosition;
27 import org.jetbrains.annotations.NotNull;
28 import org.jetbrains.annotations.Nullable;
29
30 /**
31  * @author nik
32  */
33 public class XSourcePositionImpl implements XSourcePosition {
34   private final VirtualFile myFile;
35   private final int myLine;
36   private final int myOffset;
37
38   private XSourcePositionImpl(@NotNull VirtualFile file, final int line, final int offset) {
39     myFile = file;
40     myLine = line;
41     myOffset = offset;
42   }
43
44   @Override
45   public int getLine() {
46     return myLine;
47   }
48
49   @Override
50   public int getOffset() {
51     return myOffset;
52   }
53
54   @Override
55   @NotNull
56   public VirtualFile getFile() {
57     return myFile;
58   }
59
60   /**
61    * do not call this method from plugins, use {@link com.intellij.xdebugger.XDebuggerUtil#createPositionByOffset(com.intellij.openapi.vfs.VirtualFile, int)} instead
62    */
63   @Nullable
64   public static XSourcePositionImpl createByOffset(@Nullable VirtualFile file, final int offset) {
65     if (file == null) return null;
66     Document document = FileDocumentManager.getInstance().getDocument(file);
67     if (document == null) {
68       return null;
69     }
70     int line = offset < document.getTextLength() ? document.getLineNumber(offset) : -1;
71     return new XSourcePositionImpl(file, line, offset);
72   }
73
74   /**
75    * do not call this method from plugins, use {@link com.intellij.xdebugger.XDebuggerUtil#createPosition(com.intellij.openapi.vfs.VirtualFile, int)} instead
76    */
77   @Nullable
78   public static XSourcePositionImpl create(@Nullable VirtualFile file, int line) {
79     if (file == null) {
80       return null;
81     }
82
83     int offset;
84     if (file instanceof LightVirtualFile || file instanceof HttpVirtualFile) {
85       offset = -1;
86     }
87     else {
88       Document document = FileDocumentManager.getInstance().getDocument(file);
89       if (document == null) {
90         return null;
91       }
92       if (line < 0) {
93         line = 0;
94       }
95
96       offset = line < document.getLineCount() ? document.getLineStartOffset(line) : -1;
97     }
98     return new XSourcePositionImpl(file, line, offset);
99   }
100
101   @Override
102   @NotNull
103   public Navigatable createNavigatable(@NotNull Project project) {
104     return createOpenFileDescriptor(project, this);
105   }
106
107   @NotNull
108   public static OpenFileDescriptor createOpenFileDescriptor(@NotNull Project project, @NotNull XSourcePosition position) {
109     return position.getOffset() != -1 ? new OpenFileDescriptor(project, position.getFile(), position.getOffset()) : new OpenFileDescriptor(project, position.getFile(), position.getLine(), 0);
110   }
111 }