Changeset View
Changeset View
Standalone View
Standalone View
parsejob.cpp
Show All 21 Lines | |||||
22 | */ | 22 | */ | ||
23 | 23 | | |||
24 | #include "parsejob.h" | 24 | #include "parsejob.h" | ||
25 | 25 | | |||
26 | #include <cassert> | 26 | #include <cassert> | ||
27 | #include <sys/stat.h> | 27 | #include <sys/stat.h> | ||
28 | #include <sys/mman.h> | 28 | #include <sys/mman.h> | ||
29 | 29 | | |||
30 | #include "Thread.h" | | |||
31 | | ||||
32 | #include <QFile> | 30 | #include <QFile> | ||
33 | #include <QFileInfo> | 31 | #include <QFileInfo> | ||
34 | #include <QByteArray> | 32 | #include <QByteArray> | ||
35 | #include <QReadLocker> | 33 | #include <QReadLocker> | ||
36 | 34 | #include <QDebug> | |||
37 | #include <kdebug.h> | | |||
38 | #include <klocale.h> | | |||
39 | 35 | | |||
40 | #include "javalanguagesupport.h" | 36 | #include "javalanguagesupport.h" | ||
41 | 37 | | |||
42 | // from the parser subdirectory | 38 | // from the parser subdirectory | ||
43 | #include <parser/parsesession.h> | 39 | #include <parser/parsesession.h> | ||
44 | #include <parser/javaparser.h> | 40 | #include <parser/javaparser.h> | ||
45 | #include <parser/javadefaultvisitor.h> | 41 | #include <parser/javadefaultvisitor.h> | ||
46 | 42 | | |||
47 | #include <interfaces/ilanguage.h> | | |||
48 | #include <language/interfaces/icodehighlighting.h> | 43 | #include <language/interfaces/icodehighlighting.h> | ||
49 | 44 | | |||
50 | #include "parser/dumptree.h" | 45 | #include "parser/dumptree.h" | ||
51 | 46 | | |||
52 | #include <language/duchain/duchain.h> | 47 | #include <language/duchain/duchain.h> | ||
53 | #include <language/duchain/duchainlock.h> | 48 | #include <language/duchain/duchainlock.h> | ||
54 | 49 | | |||
55 | #include "duchain/declarationbuilder.h" | 50 | #include "duchain/declarationbuilder.h" | ||
56 | #include "duchain/usebuilder.h" | 51 | #include "duchain/usebuilder.h" | ||
57 | #include "duchain/editorintegrator.h" | 52 | #include "duchain/editorintegrator.h" | ||
58 | #include "duchain/dumpchain.h" | 53 | #include "duchain/dumpchain.h" | ||
59 | #include <language/duchain/duchainutils.h> | 54 | #include <language/duchain/duchainutils.h> | ||
60 | #include <language/duchain/problem.h> | 55 | #include <language/duchain/problem.h> | ||
61 | #include <interfaces/ilanguagecontroller.h> | 56 | #include <interfaces/ilanguagecontroller.h> | ||
62 | #include <kio/job.h> | 57 | #include <kio/job.h> | ||
63 | #include <KIO/NetAccess> | | |||
64 | #include <QApplication> | 58 | #include <QApplication> | ||
65 | #include <kzip.h> | 59 | #include <kzip.h> | ||
66 | #include <language/backgroundparser/backgroundparser.h> | 60 | #include <language/backgroundparser/backgroundparser.h> | ||
67 | #include <interfaces/icore.h> | 61 | #include <interfaces/icore.h> | ||
68 | 62 | | |||
69 | namespace java | 63 | namespace java | ||
70 | { | 64 | { | ||
71 | 65 | | |||
Show All 23 Lines | 88 | { | |||
95 | return m_readFromDisk; | 89 | return m_readFromDisk; | ||
96 | } | 90 | } | ||
97 | 91 | | |||
98 | void ParseJob::run() | 92 | void ParseJob::run() | ||
99 | { | 93 | { | ||
100 | if ( abortRequested() ) | 94 | if ( abortRequested() ) | ||
101 | return abortJob(); | 95 | return abortJob(); | ||
102 | 96 | | |||
103 | KUrl fileUrl(document().str()); | 97 | QUrl fileUrl(document().str()); | ||
104 | 98 | | |||
105 | if ( !(minimumFeatures() & KDevelop::TopDUContext::ForceUpdate) ) { | 99 | if ( !(minimumFeatures() & KDevelop::TopDUContext::ForceUpdate) ) { | ||
106 | bool needsUpdate = true; | 100 | bool needsUpdate = true; | ||
107 | KDevelop::DUChainReadLocker lock; | 101 | KDevelop::DUChainReadLocker lock; | ||
108 | ///TODO: this is hacky - we check for any env file for a zipped file and assume it's up2date | 102 | ///TODO: this is hacky - we check for any env file for a zipped file and assume it's up2date | ||
109 | /// updating a zip file won't trigger reparsing though... | 103 | /// updating a zip file won't trigger reparsing though... | ||
110 | bool isZipFile = fileUrl.protocol() == "zip"; | 104 | bool isZipFile = fileUrl.scheme() == "zip"; | ||
111 | foreach(const KDevelop::ParsingEnvironmentFilePointer &file, KDevelop::DUChain::self()->allEnvironmentFiles(document())) { | 105 | foreach(const KDevelop::ParsingEnvironmentFilePointer &file, KDevelop::DUChain::self()->allEnvironmentFiles(document())) { | ||
112 | if (file->needsUpdate() && !(isZipFile && file->featuresSatisfied(minimumFeatures()))) { | 106 | if (file->needsUpdate() && !(isZipFile && file->featuresSatisfied(minimumFeatures()))) { | ||
113 | needsUpdate = true; | 107 | needsUpdate = true; | ||
114 | break; | 108 | break; | ||
115 | } else { | 109 | } else { | ||
116 | needsUpdate = false; | 110 | needsUpdate = false; | ||
117 | } | 111 | } | ||
118 | } | 112 | } | ||
119 | if (!needsUpdate) { | 113 | if (!needsUpdate) { | ||
120 | kDebug() << "Already up to date" << document().str(); | 114 | qDebug() << "Already up to date" << document().str(); | ||
121 | return; | 115 | return; | ||
122 | } | 116 | } | ||
123 | } | 117 | } | ||
124 | 118 | | |||
125 | if ( abortRequested() ) | 119 | if ( abortRequested() ) | ||
126 | return abortJob(); | 120 | return abortJob(); | ||
127 | 121 | | |||
128 | KDevelop::ProblemPointer p = readContents(); | 122 | KDevelop::ProblemPointer p = readContents(); | ||
129 | if (p) | 123 | if (p) | ||
130 | return abortJob(); | 124 | return abortJob(); | ||
131 | m_session->setContents(contents().contents); | 125 | m_session->setContents(contents().contents); | ||
132 | 126 | | |||
133 | QReadLocker lock(java()->language()->parseLock()); | 127 | QReadLocker lock(java()->language()->parseLock()); | ||
134 | 128 | | |||
135 | kDebug() << "===-- PARSING --===> " | 129 | qDebug() << "===-- PARSING --===> " | ||
136 | << document().str() | 130 | << document().str() | ||
137 | << " <== readFromDisk: " << m_readFromDisk | 131 | << " <== readFromDisk: " << m_readFromDisk | ||
138 | << " size: " << m_session->size(); | 132 | << " size: " << m_session->size(); | ||
139 | 133 | | |||
140 | if ( abortRequested() ) | 134 | if ( abortRequested() ) | ||
141 | return abortJob(); | 135 | return abortJob(); | ||
142 | 136 | | |||
143 | // 0) setup | 137 | // 0) setup | ||
Show All 25 Lines | 162 | { | |||
169 | // FIXME | 163 | // FIXME | ||
170 | //java_parser.yy_expected_symbol(AstNode::Kind_compilation_unit, "compilation_unit"); // ### remove me | 164 | //java_parser.yy_expected_symbol(AstNode::Kind_compilation_unit, "compilation_unit"); // ### remove me | ||
171 | } | 165 | } | ||
172 | 166 | | |||
173 | // 3) Form definition-use chain | 167 | // 3) Form definition-use chain | ||
174 | m_session->m_document = document(); | 168 | m_session->m_document = document(); | ||
175 | java::EditorIntegrator editor(parseSession()); | 169 | java::EditorIntegrator editor(parseSession()); | ||
176 | 170 | | |||
177 | //kDebug( ) << (contentContext ? "updating" : "building") << "duchain for" << parentJob()->document().str(); | 171 | //qDebug( ) << (contentContext ? "updating" : "building") << "duchain for" << parentJob()->document().str(); | ||
178 | 172 | | |||
179 | // TODO: use zip hash to find out if jdk/other source has changed when going for 2nd pass | 173 | // TODO: use zip hash to find out if jdk/other source has changed when going for 2nd pass | ||
180 | 174 | | |||
181 | KDevelop::ReferencedTopDUContext toUpdate; | 175 | KDevelop::ReferencedTopDUContext toUpdate; | ||
182 | { | 176 | { | ||
183 | KDevelop::DUChainReadLocker lock; | 177 | KDevelop::DUChainReadLocker lock; | ||
184 | toUpdate = KDevelop::DUChainUtils::standardContextForUrl(document().toUrl()); | 178 | toUpdate = KDevelop::DUChainUtils::standardContextForUrl(document().toUrl()); | ||
185 | } | 179 | } | ||
186 | 180 | | |||
187 | KDevelop::TopDUContext::Features newFeatures = minimumFeatures(); | 181 | KDevelop::TopDUContext::Features newFeatures = minimumFeatures(); | ||
188 | if (toUpdate) | 182 | if (toUpdate) | ||
189 | newFeatures = (KDevelop::TopDUContext::Features)(newFeatures | toUpdate->features()); | 183 | newFeatures = (KDevelop::TopDUContext::Features)(newFeatures | toUpdate->features()); | ||
190 | 184 | | |||
191 | if (newFeatures & KDevelop::TopDUContext::ForceUpdate) | 185 | if (newFeatures & KDevelop::TopDUContext::ForceUpdate) | ||
192 | kDebug() << "update enforced"; | 186 | qDebug() << "update enforced"; | ||
193 | 187 | | |||
194 | //Remove update-flags like 'Recursive' or 'ForceUpdate' | 188 | //Remove update-flags like 'Recursive' or 'ForceUpdate' | ||
195 | newFeatures = static_cast<KDevelop::TopDUContext::Features>(newFeatures & KDevelop::TopDUContext::AllDeclarationsContextsUsesAndAST); | 189 | newFeatures = static_cast<KDevelop::TopDUContext::Features>(newFeatures & KDevelop::TopDUContext::AllDeclarationsContextsUsesAndAST); | ||
196 | 190 | | |||
197 | DeclarationBuilder declarationBuilder(&editor); | 191 | DeclarationBuilder declarationBuilder(&editor); | ||
198 | 192 | | |||
199 | if (newFeatures == KDevelop::TopDUContext::SimplifiedVisibleDeclarationsAndContexts) { | 193 | if (newFeatures == KDevelop::TopDUContext::SimplifiedVisibleDeclarationsAndContexts) { | ||
200 | declarationBuilder.setOnlyComputeVisible(true); //Only visible declarations/contexts need to be built. | 194 | declarationBuilder.setOnlyComputeVisible(true); //Only visible declarations/contexts need to be built. | ||
201 | declarationBuilder.setBuildCompleteTypes(false); | 195 | declarationBuilder.setBuildCompleteTypes(false); | ||
202 | 196 | | |||
203 | } else if (newFeatures == KDevelop::TopDUContext::VisibleDeclarationsAndContexts) { | 197 | } else if (newFeatures == KDevelop::TopDUContext::VisibleDeclarationsAndContexts) { | ||
204 | declarationBuilder.setOnlyComputeVisible(true); //Only visible declarations/contexts need to be built. | 198 | declarationBuilder.setOnlyComputeVisible(true); //Only visible declarations/contexts need to be built. | ||
205 | } | 199 | } | ||
206 | 200 | | |||
207 | 201 | | |||
208 | KDevelop::TopDUContext* chain = declarationBuilder.build(document(), ast, toUpdate); | 202 | KDevelop::TopDUContext* chain = declarationBuilder.build(document(), ast, toUpdate); | ||
209 | setDuChain(chain); | 203 | setDuChain(chain); | ||
210 | 204 | | |||
211 | bool declarationsComplete = !declarationBuilder.hadUnresolvedIdentifiers(); | 205 | bool declarationsComplete = !declarationBuilder.hadUnresolvedIdentifiers(); | ||
212 | 206 | | |||
213 | kDebug() << "Parsing with feature set: " << newFeatures << " complete:" <<declarationsComplete; | 207 | qDebug() << "Parsing with feature set: " << newFeatures << " complete:" <<declarationsComplete; | ||
214 | 208 | | |||
215 | if (!declarationsComplete) { | 209 | if (!declarationsComplete) { | ||
216 | if (!declarationBuilder.identifiersRemainUnresolved()) { | 210 | if (!declarationBuilder.identifiersRemainUnresolved()) { | ||
217 | // Internal dependency needed completing | 211 | // Internal dependency needed completing | ||
218 | // Builders aren't designed for re-use | 212 | // Builders aren't designed for re-use | ||
219 | DeclarationBuilder builder2(&editor); | 213 | DeclarationBuilder builder2(&editor); | ||
220 | builder2.build(document(), ast, KDevelop::ReferencedTopDUContext(chain)); | 214 | builder2.build(document(), ast, KDevelop::ReferencedTopDUContext(chain)); | ||
221 | if (!builder2.hadUnresolvedIdentifiers()) { | 215 | if (!builder2.hadUnresolvedIdentifiers()) { | ||
222 | declarationsComplete = true; | 216 | declarationsComplete = true; | ||
223 | } else { | 217 | } else { | ||
224 | kDebug() << "Builder found unresolved identifiers when they were supposedly all resolved!"; | 218 | qDebug() << "Builder found unresolved identifiers when they were supposedly all resolved!"; | ||
225 | } | 219 | } | ||
226 | } | 220 | } | ||
227 | 221 | | |||
228 | if (!declarationsComplete) { | 222 | if (!declarationsComplete) { | ||
229 | if (newFeatures == KDevelop::TopDUContext::SimplifiedVisibleDeclarationsAndContexts) { | 223 | if (newFeatures == KDevelop::TopDUContext::SimplifiedVisibleDeclarationsAndContexts) { | ||
230 | // Need to create new parse job with lower priority | 224 | // Need to create new parse job with lower priority | ||
231 | kDebug() << "Reschedule file " << fileUrl << "for parsing"; | 225 | qDebug() << "Reschedule file " << fileUrl << "for parsing"; | ||
232 | KDevelop::ICore::self()->languageController()->backgroundParser()->addDocument(KDevelop::IndexedString(fileUrl), static_cast<KDevelop::TopDUContext::Features>(newFeatures | KDevelop::TopDUContext::VisibleDeclarationsAndContexts), 10000); | 226 | KDevelop::ICore::self()->languageController()->backgroundParser()->addDocument(KDevelop::IndexedString(fileUrl), static_cast<KDevelop::TopDUContext::Features>(newFeatures | KDevelop::TopDUContext::VisibleDeclarationsAndContexts), 10000); | ||
233 | 227 | | |||
234 | } else { | 228 | } else { | ||
235 | // We haven't resolved all identifiers, but by now, we don't expect to | 229 | // We haven't resolved all identifiers, but by now, we don't expect to | ||
236 | kDebug() << "Builder found unresolved identifiers when they should have been resolved! (if there was no coding error)"; | 230 | qDebug() << "Builder found unresolved identifiers when they should have been resolved! (if there was no coding error)"; | ||
237 | declarationsComplete = true; | 231 | declarationsComplete = true; | ||
238 | } | 232 | } | ||
239 | } | 233 | } | ||
240 | } | 234 | } | ||
241 | 235 | | |||
242 | if (declarationsComplete && (newFeatures & KDevelop::TopDUContext::AllDeclarationsContextsAndUses) == KDevelop::TopDUContext::AllDeclarationsContextsAndUses) { | 236 | if (declarationsComplete && (newFeatures & KDevelop::TopDUContext::AllDeclarationsContextsAndUses) == KDevelop::TopDUContext::AllDeclarationsContextsAndUses) { | ||
243 | kDebug() << "Building uses"; | 237 | qDebug() << "Building uses"; | ||
244 | UseBuilder useBuilder(&editor); | 238 | UseBuilder useBuilder(&editor); | ||
245 | useBuilder.buildUses(ast); | 239 | useBuilder.buildUses(ast); | ||
246 | } | 240 | } | ||
247 | 241 | | |||
248 | if (!abortRequested()) { | 242 | if (!abortRequested()) { | ||
249 | 243 | | |||
250 | if ( java()->codeHighlighting() ) | 244 | if ( java()->codeHighlighting() ) | ||
251 | { | 245 | { | ||
252 | java()->codeHighlighting()->highlightDUChain( duChain() ); | 246 | java()->codeHighlighting()->highlightDUChain( duChain() ); | ||
253 | } | 247 | } | ||
254 | } | 248 | } | ||
255 | 249 | | |||
256 | if (declarationsComplete && (newFeatures & KDevelop::TopDUContext::AllDeclarationsContextsAndUses) == KDevelop::TopDUContext::AllDeclarationsContextsAndUses) { | 250 | if (declarationsComplete && (newFeatures & KDevelop::TopDUContext::AllDeclarationsContextsAndUses) == KDevelop::TopDUContext::AllDeclarationsContextsAndUses) { | ||
257 | DumpChain dump; | 251 | DumpChain dump; | ||
258 | dump.dump(ast, m_session); | 252 | dump.dump(ast, m_session); | ||
259 | 253 | | |||
260 | KDevelop::DUChainReadLocker duchainlock(KDevelop::DUChain::lock()); | 254 | KDevelop::DUChainReadLocker duchainlock(KDevelop::DUChain::lock()); | ||
261 | dump.dump(chain); | 255 | dump.dump(chain); | ||
262 | } | 256 | } | ||
263 | } | 257 | } | ||
264 | 258 | | |||
265 | 259 | | |||
266 | } // end of namespace java | 260 | } // end of namespace java | ||
267 | 261 | | |||
268 | #include "parsejob.moc" | | |||
269 | | ||||
270 | // kate: space-indent on; indent-width 4; tab-width 4; replace-tabs on | 262 | // kate: space-indent on; indent-width 4; tab-width 4; replace-tabs on |