From 751f617aac000ea1cddc0d52d58ba5ed3a6318a3 Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin
+Specify an alias for a Doxygen command with the given name. This can be useful +for custom Doxygen commands which can be defined using ALIASES option +for Doxygen itself but which are unknown to SWIG. "command-name" is the +name of the command in the Doxyfile, e.g. if it contains +
+ ++ALIASES = "sideeffect=\par Side Effects:\n" +
+Then you could also the same expansion for SWIG with: +
+ +
+%feature("doxygen:alias:sideeffect") "\par Side Effects:\n"
++Please note that command arguments are not currently supported with this +feature. +
+ ++Notice that it is perfectly possible and potentially useful to define the alias +expansion differently depending on the target language, e.g. with +
+ +
+#ifdef SWIGJAVA
+%feature("doxygen:alias:not_for_java") "This functionality is not available for Java"
+#else
+%feature("doxygen:alias:not_for_java") ""
+#endif
++you could use @not_for_java in the documentation comments of all +functions which can't, for whatever reason, be currently exposed in Java +wrappers of the C++ API. +
+ +-Specify that the Doxygen command with the given name should be ignored. This is -useful for custom Doxygen commands which can be defined using ALIASES -option for Doxygen itself but which are unknown to SWIG. "command-name" -is the real name of the command, e.g. you could use +This feature allows to just ignore an unknown Doxygen command, instead of +replacing it with a predefined text as doxygen:alias features allows to +do. For example, you could use
diff --git a/Examples/test-suite/common.mk b/Examples/test-suite/common.mk
index c8670801c..806be3da3 100644
--- a/Examples/test-suite/common.mk
+++ b/Examples/test-suite/common.mk
@@ -583,6 +583,7 @@ $(eval HAS_DOXYGEN := $($(LANGUAGE)_HAS_DOXYGEN))
ifdef HAS_DOXYGEN
DOXYGEN_TEST_CASES += \
doxygen_parsing \
+ doxygen_alias \
doxygen_ignore \
doxygen_basic_translate \
doxygen_basic_notranslate \
diff --git a/Examples/test-suite/doxygen_alias.i b/Examples/test-suite/doxygen_alias.i
new file mode 100644
index 000000000..79cb7964b
--- /dev/null
+++ b/Examples/test-suite/doxygen_alias.i
@@ -0,0 +1,22 @@
+%module doxygen_alias
+
+#ifdef SWIGJAVA
+%feature("doxygen:alias:nullptr") "null"
+#elif defined(SWIGPYTHON)
+%feature("doxygen:alias:nullptr") "None"
+#else
+%feature("doxygen:alias:nullptr") "NULL"
+#endif
+
+%inline %{
+
+class Something {};
+
+/**
+ A function returning something.
+
+ @returns A new object which may be @nullptr.
+ */
+Something* make_something() { return 0; }
+
+%}
diff --git a/Examples/test-suite/java/doxygen_alias_runme.java b/Examples/test-suite/java/doxygen_alias_runme.java
new file mode 100644
index 000000000..e21ed6d19
--- /dev/null
+++ b/Examples/test-suite/java/doxygen_alias_runme.java
@@ -0,0 +1,32 @@
+
+import doxygen_alias.*;
+import com.sun.javadoc.*;
+import java.util.HashMap;
+
+public class doxygen_alias_runme {
+ static {
+ try {
+ System.loadLibrary("doxygen_alias");
+ } catch (UnsatisfiedLinkError e) {
+ System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e);
+ System.exit(1);
+ }
+ }
+
+ public static void main(String argv[])
+ {
+ CommentParser parser = new CommentParser();
+ com.sun.tools.javadoc.Main.execute("doxygen_alias runtime test",
+ "CommentParser",
+ new String[]{"-quiet", "doxygen_alias"});
+
+ HashMap wantedComments = new HashMap();
+ wantedComments.put("doxygen_alias.doxygen_alias.make_something()",
+ " A function returning something.
\n" +
+ "
\n" +
+ " @return A new object which may be null.\n" +
+ "");
+
+ System.exit(parser.check(wantedComments));
+ }
+}
diff --git a/Examples/test-suite/python/doxygen_alias_runme.py b/Examples/test-suite/python/doxygen_alias_runme.py
new file mode 100644
index 000000000..4117f00e5
--- /dev/null
+++ b/Examples/test-suite/python/doxygen_alias_runme.py
@@ -0,0 +1,12 @@
+#!/usr/bin/python
+
+import doxygen_alias
+import inspect
+import commentVerifier
+
+commentVerifier.check(inspect.getdoc(doxygen_alias.make_something),
+ """\
+A function returning something.
+
+:rtype: :py:class:`Something`
+:return: A new object which may be None.""")
diff --git a/Source/DoxygenTranslator/src/DoxygenParser.cpp b/Source/DoxygenTranslator/src/DoxygenParser.cpp
index 88b2863cf..e42f7400a 100644
--- a/Source/DoxygenTranslator/src/DoxygenParser.cpp
+++ b/Source/DoxygenTranslator/src/DoxygenParser.cpp
@@ -137,6 +137,11 @@ DoxygenParser::commandBelongs(const std::string &theCommand)
return it->second;
}
+ // Check if this command is defined as an alias.
+ if (String* const alias = Getattr(m_node, ("feature:doxygen:alias:" + theCommand).c_str())) {
+ return COMMAND_ALIAS;
+ }
+
// Check if this command should be ignored.
if (String* const ignore = getIgnoreFeature(theCommand)) {
// Check that no value is specified for this feature ("1" is the implicit
@@ -895,6 +900,18 @@ DoxygenParser::addCommandUnique(const std::string &theCommand,
}
}
+void
+DoxygenParser::aliasCommand(const std::string& theCommand,
+ const TokenList& /* tokList */,
+ DoxygenEntityList &doxyList)
+{
+ String* const alias = Getattr(m_node, ("feature:doxygen:alias:" + theCommand).c_str());
+ if (!alias)
+ return;
+
+ doxyList.push_back(DoxygenEntity("plainstd::string", Char(alias)));
+}
+
String* DoxygenParser::getIgnoreFeature(const std::string& theCommand,
const char* argument) const
{
@@ -1052,6 +1069,9 @@ DoxygenParser::addCommand(const std::string &commandString,
case COMMAND_HTML_ENTITY:
addCommandHtmlEntity(theCommand, tokList, doxyList);
break;
+ case COMMAND_ALIAS:
+ aliasCommand(commandString, tokList, doxyList);
+ break;
case COMMAND_IGNORE:
ignoreCommand(commandString, tokList, doxyList);
break;
diff --git a/Source/DoxygenTranslator/src/DoxygenParser.h b/Source/DoxygenTranslator/src/DoxygenParser.h
index 521d2a02f..82550465d 100644
--- a/Source/DoxygenTranslator/src/DoxygenParser.h
+++ b/Source/DoxygenTranslator/src/DoxygenParser.h
@@ -39,6 +39,7 @@ private:
COMMANDUNIQUE,
COMMAND_HTML,
COMMAND_HTML_ENTITY,
+ COMMAND_ALIAS,
COMMAND_IGNORE,
END_LINE,
PARAGRAPH_END,
@@ -346,6 +347,13 @@ private:
const TokenList &tokList,
DoxygenEntityList &doxyList);
+ /*
+ * Replace the given command with its predefined alias expansion.
+ */
+ void aliasCommand(const std::string& theCommand,
+ const TokenList &tokList,
+ DoxygenEntityList &doxyList);
+
/*
* Simply ignore the given command, possibly with the word following it or
* until the matching end command.