Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Marco Bubke
flatpak-qt-creator
Commits
aae5b921
Commit
aae5b921
authored
Dec 04, 2009
by
Roberto Raggi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use mappedReduce when searching for the usages of a symbol.
parent
425c61f6
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
83 additions
and
55 deletions
+83
-55
src/libs/cplusplus/FindUsages.cpp
src/libs/cplusplus/FindUsages.cpp
+2
-7
src/libs/cplusplus/FindUsages.h
src/libs/cplusplus/FindUsages.h
+3
-5
src/plugins/cpptools/cppfindreferences.cpp
src/plugins/cpptools/cppfindreferences.cpp
+78
-43
No files found.
src/libs/cplusplus/FindUsages.cpp
View file @
aae5b921
...
...
@@ -41,9 +41,8 @@
using
namespace
CPlusPlus
;
FindUsages
::
FindUsages
(
Document
::
Ptr
doc
,
const
Snapshot
&
snapshot
,
QFutureInterface
<
Usage
>
*
future
)
FindUsages
::
FindUsages
(
Document
::
Ptr
doc
,
const
Snapshot
&
snapshot
)
:
ASTVisitor
(
doc
->
translationUnit
()),
_future
(
future
),
_doc
(
doc
),
_snapshot
(
snapshot
),
_source
(
_doc
->
source
()),
...
...
@@ -131,12 +130,8 @@ void FindUsages::reportResult(unsigned tokenIndex)
const
int
len
=
tk
.
f
.
length
;
const
Usage
u
(
_doc
->
fileName
(),
line
,
line
Text
,
col
,
len
);
const
Usage
u
(
_doc
->
fileName
(),
line
Text
,
line
,
col
,
len
);
_usages
.
append
(
u
);
if
(
_future
)
_future
->
reportResult
(
u
);
_references
.
append
(
tokenIndex
);
}
...
...
src/libs/cplusplus/FindUsages.h
View file @
aae5b921
...
...
@@ -34,9 +34,8 @@
#include "CppDocument.h"
#include "CppBindings.h"
#include "Semantic.h"
#include <ASTVisitor.h>
#include <QtCore/Q
FutureInterface
>
#include <QtCore/Q
Set
>
namespace
CPlusPlus
{
...
...
@@ -46,7 +45,7 @@ public:
Usage
()
:
line
(
0
),
col
(
0
),
len
(
0
)
{}
Usage
(
const
QString
&
path
,
int
line
,
const
QString
&
lineText
,
int
col
,
int
len
)
Usage
(
const
QString
&
path
,
const
QString
&
lineText
,
int
line
,
int
col
,
int
len
)
:
path
(
path
),
lineText
(
lineText
),
line
(
line
),
col
(
col
),
len
(
len
)
{}
public:
...
...
@@ -60,7 +59,7 @@ public:
class
CPLUSPLUS_EXPORT
FindUsages
:
protected
ASTVisitor
{
public:
FindUsages
(
Document
::
Ptr
doc
,
const
Snapshot
&
snapshot
,
QFutureInterface
<
Usage
>
*
future
);
FindUsages
(
Document
::
Ptr
doc
,
const
Snapshot
&
snapshot
);
void
setGlobalNamespaceBinding
(
NamespaceBindingPtr
globalNamespaceBinding
);
...
...
@@ -103,7 +102,6 @@ protected:
virtual
void
endVisit
(
SimpleDeclarationAST
*
);
private:
QFutureInterface
<
Usage
>
*
_future
;
const
Identifier
*
_id
;
Symbol
*
_declSymbol
;
Document
::
Ptr
_doc
;
...
...
src/plugins/cpptools/cppfindreferences.cpp
View file @
aae5b921
...
...
@@ -54,10 +54,13 @@
#include <QtCore/QTime>
#include <QtCore/QtConcurrentRun>
#include <QtCore/QtConcurrentMap>
#include <QtCore/QDir>
#include <QtGui/QApplication>
#include <qtconcurrent/runextensions.h>
#include <functional>
using
namespace
CppTools
::
Internal
;
using
namespace
CPlusPlus
;
...
...
@@ -81,7 +84,7 @@ QList<int> CppFindReferences::references(Symbol *symbol,
{
QList
<
int
>
references
;
FindUsages
findUsages
(
doc
,
snapshot
,
/*future = */
0
);
FindUsages
findUsages
(
doc
,
snapshot
);
findUsages
.
setGlobalNamespaceBinding
(
bind
(
doc
,
snapshot
));
findUsages
(
symbol
);
references
=
findUsages
.
references
();
...
...
@@ -89,6 +92,77 @@ QList<int> CppFindReferences::references(Symbol *symbol,
return
references
;
}
class
MyProcess
:
public
std
::
unary_function
<
QString
,
QList
<
Usage
>
>
{
const
QMap
<
QString
,
QString
>
wl
;
const
Snapshot
snapshot
;
Symbol
*
symbol
;
public:
MyProcess
(
const
QMap
<
QString
,
QString
>
wl
,
const
Snapshot
snapshot
,
Symbol
*
symbol
)
:
wl
(
wl
),
snapshot
(
snapshot
),
symbol
(
symbol
)
{
}
QList
<
Usage
>
operator
()(
const
QString
&
fileName
)
{
QList
<
Usage
>
usages
;
const
Identifier
*
symbolId
=
symbol
->
identifier
();
if
(
Document
::
Ptr
previousDoc
=
snapshot
.
value
(
fileName
))
{
Control
*
control
=
previousDoc
->
control
();
if
(
!
control
->
findIdentifier
(
symbolId
->
chars
(),
symbolId
->
size
()))
return
usages
;
// skip this document, it's not using symbolId.
}
QByteArray
source
;
if
(
wl
.
contains
(
fileName
))
source
=
snapshot
.
preprocessedCode
(
wl
.
value
(
fileName
),
fileName
);
else
{
QFile
file
(
fileName
);
if
(
!
file
.
open
(
QFile
::
ReadOnly
))
return
usages
;
const
QString
contents
=
QTextStream
(
&
file
).
readAll
();
// ### FIXME
source
=
snapshot
.
preprocessedCode
(
contents
,
fileName
);
}
Document
::
Ptr
doc
=
snapshot
.
documentFromSource
(
source
,
fileName
);
doc
->
tokenize
();
Control
*
control
=
doc
->
control
();
if
(
control
->
findIdentifier
(
symbolId
->
chars
(),
symbolId
->
size
())
!=
0
)
{
doc
->
check
();
FindUsages
process
(
doc
,
snapshot
);
process
.
setGlobalNamespaceBinding
(
bind
(
doc
,
snapshot
));
process
(
symbol
);
usages
=
process
.
usages
();
}
return
usages
;
}
};
class
MyReduce
:
public
std
::
binary_function
<
QList
<
Usage
>
&
,
QList
<
Usage
>
,
void
>
{
QFutureInterface
<
Usage
>
*
future
;
public:
MyReduce
(
QFutureInterface
<
Usage
>
*
future
)
:
future
(
future
)
{}
void
operator
()(
QList
<
Usage
>
&
uu
,
const
QList
<
Usage
>
&
usages
)
{
foreach
(
const
Usage
&
u
,
usages
)
future
->
reportResult
(
u
);
future
->
setProgressValue
(
future
->
progressValue
()
+
1
);
}
};
static
void
find_helper
(
QFutureInterface
<
Usage
>
&
future
,
const
QMap
<
QString
,
QString
>
wl
,
Snapshot
snapshot
,
...
...
@@ -121,49 +195,10 @@ static void find_helper(QFutureInterface<Usage> &future,
future
.
setProgressRange
(
0
,
files
.
size
());
for
(
int
i
=
0
;
i
<
files
.
size
();
++
i
)
{
if
(
future
.
isPaused
())
future
.
waitForResume
();
if
(
future
.
isCanceled
())
break
;
const
QString
&
fileName
=
files
.
at
(
i
);
future
.
setProgressValueAndText
(
i
,
QFileInfo
(
fileName
).
fileName
());
if
(
Document
::
Ptr
previousDoc
=
snapshot
.
value
(
fileName
))
{
Control
*
control
=
previousDoc
->
control
();
const
Identifier
*
id
=
control
->
findIdentifier
(
symbolId
->
chars
(),
symbolId
->
size
());
if
(
!
id
)
continue
;
// skip this document, it's not using symbolId.
}
QByteArray
source
;
MyProcess
process
(
wl
,
snapshot
,
symbol
);
MyReduce
reduce
(
&
future
);
if
(
wl
.
contains
(
fileName
))
source
=
snapshot
.
preprocessedCode
(
wl
.
value
(
fileName
),
fileName
);
else
{
QFile
file
(
fileName
);
if
(
!
file
.
open
(
QFile
::
ReadOnly
))
continue
;
const
QString
contents
=
QTextStream
(
&
file
).
readAll
();
// ### FIXME
source
=
snapshot
.
preprocessedCode
(
contents
,
fileName
);
}
Document
::
Ptr
doc
=
snapshot
.
documentFromSource
(
source
,
fileName
);
doc
->
tokenize
();
Control
*
control
=
doc
->
control
();
if
(
control
->
findIdentifier
(
symbolId
->
chars
(),
symbolId
->
size
())
!=
0
)
{
doc
->
check
();
FindUsages
process
(
doc
,
snapshot
,
&
future
);
process
.
setGlobalNamespaceBinding
(
bind
(
doc
,
snapshot
));
process
(
symbol
);
}
}
QtConcurrent
::
blockingMappedReduced
<
QList
<
Usage
>
>
(
files
,
process
,
reduce
);
future
.
setProgressValue
(
files
.
size
());
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment