summaryrefslogtreecommitdiffstats
path: root/umbrello/umbrello/codeimport/nativeimportbase.h
diff options
context:
space:
mode:
Diffstat (limited to 'umbrello/umbrello/codeimport/nativeimportbase.h')
-rw-r--r--umbrello/umbrello/codeimport/nativeimportbase.h227
1 files changed, 227 insertions, 0 deletions
diff --git a/umbrello/umbrello/codeimport/nativeimportbase.h b/umbrello/umbrello/codeimport/nativeimportbase.h
new file mode 100644
index 00000000..cc82fd91
--- /dev/null
+++ b/umbrello/umbrello/codeimport/nativeimportbase.h
@@ -0,0 +1,227 @@
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * copyright (C) 2005-2007 *
+ * Umbrello UML Modeller Authors <uml-devel@uml.sf.net> *
+ ***************************************************************************/
+
+#ifndef NATIVEIMPORTBASE_H
+#define NATIVEIMPORTBASE_H
+
+#include <qstring.h>
+#include <qstringlist.h>
+#include "classimport.h"
+#include "../umlnamespace.h"
+
+class UMLPackage;
+class UMLClassifier;
+
+/**
+ * Intermediate base class for native Umbrello implementations of
+ * programming language import
+ *
+ * The default call sequence is as follows (RealizedLanguageImport
+ * is used as a placeholder name for the concrete language importer.)
+ * NativeImportBase RealizedLanguageImport
+ * --> importFiles()
+ * parseFile()
+ * -----------------------------------> initVars()
+ * scan()
+ * preprocess() (may be reimplemented)
+ * ---------------------------------> fillSource()
+ * -----------------------------------> parseStmt()
+ * This sequence may be changed by overriding default implementations
+ * of virtual methods in NativeImportBase.
+ *
+ * @short Base class for native implementations of language import
+ * @author Oliver Kellogg <okellogg@users.sourceforge.net>
+ * Bugs and comments to uml-devel@lists.sf.net or http://bugs.kde.org
+ */
+class NativeImportBase : public ClassImport {
+public:
+ /**
+ * Constructor
+ * @param singleLineCommentIntro "//" for IDL and Java, "--" for Ada
+ */
+ NativeImportBase(const QString &singleLineCommentIntro);
+ virtual ~NativeImportBase();
+
+protected:
+ /**
+ * Implement abstract operation from ClassImport.
+ */
+ void initialize();
+
+ /**
+ * Set the delimiter strings for a multi line comment.
+ *
+ * @param intro In languages with a C style multiline comment
+ * this is slash-star.
+ * @param end In languages with a C style multiline comment
+ * this is star-slash.
+ */
+ void setMultiLineComment(const QString &intro, const QString &end);
+ /**
+ * Set the delimiter strings for an alternative form of
+ * multi line comment. See setMultiLineComment().
+ */
+ void setMultiLineAltComment(const QString &intro, const QString &end);
+
+ /**
+ * Import a single file.
+ * The default implementation should be feasible for languages that
+ * don't depend on an external preprocessor.
+ *
+ * @param filename The file to import.
+ */
+ virtual void parseFile(const QString& filename);
+
+ /**
+ * Initialize auxiliary variables.
+ * This is called by the default implementation of parseFile()
+ * after scanning (before parsing the QStringList m_source.)
+ * The default implementation is empty.
+ */
+ virtual void initVars();
+
+ /**
+ * Scan a single line.
+ * parseFile() calls this for each line read from the input file.
+ * This in turn calls other methods such as preprocess() and fillSource().
+ *
+ * @param line The line to scan.
+ */
+ void scan(QString line);
+
+ /**
+ * Preprocess a line.
+ * May modify the given line to remove items consumed by the
+ * preprocessing such as comments or preprocessor directives.
+ * The default implementation handles multi-line comments.
+ *
+ * @param line The line to preprocess.
+ * @return True if the line was completely consumed,
+ * false if there are still items left in the line
+ * for further analysis.
+ */
+ virtual bool preprocess(QString& line);
+
+ /**
+ * Split the line so that a string is returned as a single element of the list.
+ * When not in a string then split at white space.
+ * The default implementation is suitable for C style strings and char constants.
+ */
+ virtual QStringList split(const QString& line);
+
+ /**
+ * Analyze the given word and fill `m_source'.
+ * A "word" is a whitespace delimited item from the input line.
+ * To be provided by the specific importer class.
+ */
+ virtual void fillSource(const QString& word) = 0;
+
+ /**
+ * Parse the statement which starts at m_source[m_srcIndex]
+ * leaving m_srcIndex pointing to the end of the recognized
+ * statement.
+ * To be provided by the concrete importer.
+ *
+ * @return True if the statement was recognized.
+ */
+ virtual bool parseStmt() = 0;
+
+ /**
+ * Advance m_srcIndex until m_source[m_srcIndex] contains the lexeme
+ * given by `until'.
+ */
+ void skipStmt(QString until = ";");
+
+ /**
+ * Advance m_srcIndex to the index of the corresponding closing character
+ * of the given opening. Nested opening/closing pairs are respected.
+ * Valid openers are: '{' '[' '(' '<'
+ *
+ * @return True for success, false for misuse (invalid opener) or
+ * if no matching closing character is found in m_source.
+ */
+ bool skipToClosing(QChar opener);
+
+ /**
+ * Advance m_srcIndex until m_source[m_srcIndex] contains a non-comment.
+ * Comments encountered during advancement are accumulated in `m_comment'.
+ * If m_srcIndex hits the end of m_source then QString::null is returned.
+ */
+ QString advance();
+
+ /**
+ * How to start a single line comment in this programming language.
+ */
+ QString m_singleLineCommentIntro;
+
+ /**
+ * The scanned lexemes.
+ */
+ QStringList m_source;
+ /**
+ * Used for indexing m_source.
+ */
+ uint m_srcIndex;
+
+ /**
+ * Stack of scopes for use by the specific importer.
+ */
+ UMLPackage *m_scope[32];
+ /**
+ * Indexes m_scope. Index 0 is reserved for global scope.
+ */
+ uint m_scopeIndex;
+
+ /**
+ * The class currently being processed.
+ */
+ UMLClassifier *m_klass;
+ /**
+ * The current access (public/protected/private)
+ */
+ Uml::Visibility m_currentAccess;
+ /**
+ * Intermediate accumulator for comment text.
+ */
+ QString m_comment;
+ /**
+ * True if we are currently in a multi-line comment.
+ * Only applies to languages with multi-line comments.
+ */
+ bool m_inComment;
+ /**
+ * Accumulator for abstractness
+ */
+ bool m_isAbstract;
+
+ /**
+ * List of parsed files. Contains file names without paths.
+ * Before actually parsing a given file, NativeImportBase checks
+ * whether the name is already present in this list in order to
+ * avoid parsing the same file multiple times.
+ */
+ QStringList m_parsedFiles;
+
+ /**
+ * Multi line comment delimiters
+ */
+ QString m_multiLineCommentIntro;
+ QString m_multiLineCommentEnd;
+ /**
+ * Some languages support an alternative set of multi line
+ * comment delimiters.
+ */
+ QString m_multiLineAltCommentIntro;
+ QString m_multiLineAltCommentEnd;
+};
+
+#endif
+