~ubuntu-branches/ubuntu/utopic/kdevplatform/utopic-proposed

« back to all changes in this revision

Viewing changes to shell/kross/xmltokross/duchainextractor.cpp

  • Committer: Package Import Robot
  • Author(s): Scarlett Clark
  • Date: 2014-08-30 03:52:11 UTC
  • mfrom: (0.3.26)
  • Revision ID: package-import@ubuntu.com-20140830035211-wndqlc843eu2v8nk
Tags: 1.7.0-0ubuntu1
* New upstream release
* Add XS-Testsuite: autopkgtest

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/***************************************************************************
2
 
 *   Copyright 2008 Aleix Pol <aleixpol@gmail.com>                         *
3
 
 *                                                                         *
4
 
 *   This program is free software; you can redistribute it and/or modify  *
5
 
 *   it under the terms of the GNU Library General Public License as       *
6
 
 *   published by the Free Software Foundation; either version 2 of the    *
7
 
 *   License, or (at your option) any later version.                       *
8
 
 *                                                                         *
9
 
 *   This program is distributed in the hope that it will be useful,       *
10
 
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
11
 
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
12
 
 *   GNU General Public License for more details.                          *
13
 
 *                                                                         *
14
 
 *   You should have received a copy of the GNU Library General Public     *
15
 
 *   License along with this program; if not, write to the                 *
16
 
 *   Free Software Foundation, Inc.,                                       *
17
 
 *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
18
 
 ***************************************************************************/
19
 
 
20
 
#include "duchainextractor.h"
21
 
#include <interfaces/ilanguage.h>
22
 
#include <interfaces/ilanguagecontroller.h>
23
 
#include <interfaces/iplugin.h>
24
 
#include <interfaces/iplugincontroller.h>
25
 
#include <language/interfaces/ilanguagesupport.h>
26
 
#include <language/duchain/duchain.h>
27
 
#include <language/duchain/dumpchain.h>
28
 
#include <language/duchain/topducontext.h>
29
 
#include <language/duchain/declaration.h>
30
 
#include <language/duchain/duchainlock.h>
31
 
#include <language/backgroundparser/backgroundparser.h>
32
 
#include <shell/projectcontroller.h>
33
 
#include <shell/core.h>
34
 
#include "krosswrapper.h"
35
 
#include "krossimpl.h"
36
 
#include "dummybsm.h"
37
 
#include "duchainreader.h"
38
 
#include "project.h"
39
 
#include <QApplication>
40
 
#include <QFile>
41
 
 
42
 
using namespace KDevelop;
43
 
 
44
 
class KrossInterfaceCreator : public DUChainReader
45
 
{
46
 
    public:
47
 
        KrossInterfaceCreator(TopDUContext* top) : DUChainReader(top) {}
48
 
        virtual void writeDocument() { qDebug() << "start doc"; }
49
 
        virtual void writeClass(const QString& classname, const QString& , const QList<QStringList>& )
50
 
            { qDebug() << "start class" << classname; }
51
 
        virtual void writeNamespace(const QString& name) { qDebug() << "start namespace" << name; }
52
 
        virtual void writeVariable(const QString& name, const QString& type, bool isConst)
53
 
            { qDebug() << "start var" << name << type << isConst; }
54
 
        virtual void writeEndClass() { qDebug() << "end class"; }
55
 
        virtual void writeEndDocument() { qDebug() << "end doc"; }
56
 
        virtual void writeEndFunction(const method& m)
57
 
        {
58
 
            QStringList args;
59
 
            foreach(const method::argument& arg, m.args)
60
 
            { args+= arg.type+' '+arg.name+'='+arg.def; }
61
 
            qDebug() << "end func" << m.returnType << m.funcname << args.join(", "); 
62
 
        }
63
 
        virtual void writeEndEnum(const QStringList& flags) { qDebug() << "start enum" << flags; }
64
 
};
65
 
 
66
 
 
67
 
DUChainExtractor::DUChainExtractor(QObject* parent) : QObject(parent), m_done(false)
68
 
{
69
 
    connect(Core::self()->languageController()->backgroundParser(), SIGNAL(parseJobFinished(KDevelop::ParseJob*)),
70
 
            this, SLOT(parsingFinished(KDevelop::ParseJob*)));
71
 
}
72
 
 
73
 
void DUChainExtractor::start(const KUrl& _input, const KUrl& builddir,
74
 
                             const KUrl::List& includes, const QString& filename, 
75
 
                             const QString& directory, const QStringList& toinclude, const QString& output)
76
 
{
77
 
    input=_input;
78
 
    m_filename=filename;
79
 
    m_directory=directory;
80
 
    m_toinclude=toinclude;
81
 
    m_output=output;
82
 
    
83
 
    m_manager = new DummyBSM(0, QVariantList(), KUrl::List() << _input);
84
 
    m_manager->setBuildDir(builddir);
85
 
    m_manager->setIncludeDirectories(includes);
86
 
    DumbProject* project = new DumbProject();
87
 
    project->setManagerPlugin(m_manager);
88
 
    Core::self()->projectControllerInternal()->addProject(project);
89
 
    Core::self()->languageController()->backgroundParser()->addDocument(IndexedString(input));
90
 
}
91
 
 
92
 
void DUChainExtractor::parsingFinished(KDevelop::ParseJob* job)
93
 
{
94
 
    KDevelop::ILanguageSupport* cppLangSup=Core::self()->languageController()->language("C++")->languageSupport();
95
 
    
96
 
    DUChainReadLocker lock(DUChain::lock());
97
 
    TopDUContext* top=cppLangSup->standardContext(input);
98
 
//     TopDUContext* top=DUChain::self()->chainForDocument(input);
99
 
    qDebug() << "takatakataka" << input << top << job;
100
 
    
101
 
    KrossWrapper r(top);
102
 
    r.setFileName(m_filename);
103
 
    r.setIncludes(m_toinclude);
104
 
    r.start();
105
 
    
106
 
    qDebug() << qPrintable(QString(33, '-'));
107
 
    
108
 
    if(m_output.isEmpty())
109
 
        QTextStream(stdout) << r.output;
110
 
    else
111
 
    {
112
 
        QFile f(m_output);
113
 
        if(!f.open(QIODevice::WriteOnly | QIODevice::Text))
114
 
            return;
115
 
        QTextStream(&f) << r.output;
116
 
    }
117
 
    
118
 
    if(!m_filename.isEmpty()) {
119
 
        QFile headerFile(m_directory+'/'+m_filename+".h");
120
 
        if(!headerFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
121
 
            qDebug() << "error. can't write the header: " << m_filename+".h";
122
 
            qApp->quit();
123
 
        }
124
 
        
125
 
        QTextStream out(&headerFile);
126
 
        out << r.handlersHeader;
127
 
        headerFile.close();
128
 
    }
129
 
    
130
 
    if(m_writeImpl)
131
 
    {
132
 
        KrossImpl r(top);
133
 
        r.setIncludes(m_toinclude);
134
 
        r.start();
135
 
        
136
 
        QFile implFile(m_directory+'/'+m_filename+"impl.h");
137
 
        if(!implFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
138
 
            qDebug() << "error. can't write the impl: " << m_writeImpl << ".h";
139
 
            qApp->quit();
140
 
        }
141
 
        
142
 
        QTextStream out(&implFile);
143
 
        out << r.output;
144
 
        implFile.close();
145
 
    }
146
 
    
147
 
    m_done=true;
148
 
    qApp->quit();
149
 
}
150
 
 
151
 
void DUChainExtractor::progressUpdated(int minimum, int maximum, int value)
152
 
{
153
 
    qDebug() << "progress" << value << "/" << maximum << minimum;
154
 
}
155
 
 
156
 
#include "duchainextractor.moc"