summaryrefslogtreecommitdiffstats
path: root/src/symbolresolver.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/symbolresolver.h')
-rw-r--r--src/symbolresolver.h104
1 files changed, 104 insertions, 0 deletions
diff --git a/src/symbolresolver.h b/src/symbolresolver.h
new file mode 100644
index 0000000..5536c1e
--- /dev/null
+++ b/src/symbolresolver.h
@@ -0,0 +1,104 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2020 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef SYMBOLRESOLVER_H
+#define SYMBOLRESOLVER_H
+
+#include <memory>
+#include "qcstring.h"
+#include "classdef.h"
+
+class Definition;
+class FileDef;
+class MemberDef;
+
+//! Helper class to find a class definition or check if
+//! A symbol is accessible in a given scope.
+class SymbolResolver
+{
+ public:
+ explicit SymbolResolver(const FileDef *fileScope = 0);
+ ~SymbolResolver();
+
+ // actions
+
+ /** Find the class definition matching name within
+ * the scope set.
+ * @param scope The scope to search from.
+ * @param name The name of the symbol.
+ * @param maybeUnlinkable include unlinkable symbols in the search.
+ * @param mayBeHidden include hidden symbols in the search.
+ * @note As a result of this call the getters getTypedef(),
+ * getTemplateSpec(), and getResolvedType() are set as well.
+ */
+ const ClassDef *resolveClass(const Definition *scope,
+ const char *name,
+ bool maybeUnlinkable=false,
+ bool mayBeHidden=false);
+
+ /** Wrapper around resolveClass that returns a mutable interface to
+ * the class object or a nullptr if the symbol is immutable.
+ */
+ ClassDefMutable *resolveClassMutable(const Definition *scope,
+ const char *name,
+ bool mayBeUnlinkable=false,
+ bool mayBeHidden=false)
+ {
+ return toClassDefMutable(resolveClass(scope,name,mayBeUnlinkable,mayBeHidden));
+ }
+
+ /** Checks if symbol \a item is accessible from within \a scope.
+ * @returns -1 if \a item is not accessible or a number indicating how
+ * many scope levels up the nearest match was found.
+ */
+ int isAccessibleFrom(const Definition *scope,
+ const Definition *item);
+
+ /** Check if symbol \a item is accessible from within \a scope,
+ * where it has to match the \a explicitScopePart.
+ * @returns -1 if \a item is not accessible or a number indicating how
+ * many scope levels up the nearest match was found.
+ */
+ int isAccessibleFromWithExpScope(const Definition *scope,
+ const Definition *item,
+ const QCString &explicitScopePart
+ );
+
+ /** Sets or updates the file scope using when resolving symbols. */
+ void setFileScope(const FileDef *fd);
+
+ // getters
+
+ /** In case a call to resolveClass() resolves to a type member (e.g. an enum)
+ * this method will return it.
+ */
+ const MemberDef *getTypedef() const;
+
+ /** In case a call to resolveClass() points to a template specialization, the
+ * template part is return via this method.
+ */
+ QCString getTemplateSpec() const;
+
+ /** In case a call to resolveClass() points to a typedef or using declaration.
+ * The type name it resolved to is returned via this method.
+ */
+ QCString getResolvedType() const;
+
+ private:
+ struct Private;
+ std::unique_ptr<Private> p;
+};
+
+#endif