[analyzer] Refactor node generation to use less code.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@141133 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h b/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h
index 98c8b52..35c1790 100644
--- a/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h
+++ b/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h
@@ -114,12 +114,7 @@
   /// \brief Generate a default checker node (containing checker tag but no
   /// checker state changes).
   ExplodedNode *generateNode(bool autoTransition = true) {
-    assert(statement && "Only transitions with statements currently supported");
-    ExplodedNode *N = generateNodeImpl(statement, getState(), false,
-                                       checkerTag);
-    if (N && autoTransition)
-      Dst.Add(N);
-    return N;
+    return generateNode(getState(), autoTransition);
   }
   
   /// \brief Generate a new checker node with the given predecessor.
@@ -127,8 +122,7 @@
   ExplodedNode *generateNode(const ProgramState *state,
                              ExplodedNode *pred,
                              bool autoTransition = true) {
-   assert(statement && "Only transitions with statements currently supported");
-    ExplodedNode *N = generateNodeImpl(statement, state, pred, false);
+    ExplodedNode *N = generateNodeImpl(state, false, pred);
     if (N && autoTransition)
       addTransition(N);
     return N;
@@ -138,9 +132,7 @@
   ExplodedNode *generateNode(const ProgramState *state,
                              bool autoTransition = true,
                              const ProgramPointTag *tag = 0) {
-    assert(statement && "Only transitions with statements currently supported");
-    ExplodedNode *N = generateNodeImpl(statement, state, false,
-                                       tag ? tag : checkerTag);
+    ExplodedNode *N = generateNodeImpl(state, false, 0, tag);
     if (N && autoTransition)
       addTransition(N);
     return N;
@@ -149,9 +141,7 @@
   /// \brief Generate a sink node. Generating sink stops exploration of the
   /// given path.
   ExplodedNode *generateSink(const ProgramState *state = 0) {
-    assert(statement && "Only transitions with statements currently supported");
-    return generateNodeImpl(statement, state ? state : getState(), true,
-                            checkerTag);
+    return generateNodeImpl(state ? state : getState(), true);
   }
 
   void addTransition(ExplodedNode *node) {
@@ -179,21 +169,14 @@
   }
 
 private:
-  ExplodedNode *generateNodeImpl(const Stmt *stmt,
-                                 const ProgramState *state,
+  ExplodedNode *generateNodeImpl(const ProgramState *state,
                                  bool markAsSink,
-                                 const ProgramPointTag *tag) {
-    ExplodedNode *node = B.generateNode(stmt, state, Pred, tag);
-    if (markAsSink && node)
-      node->markAsSink();
-    return node;
-  }
-
-  ExplodedNode *generateNodeImpl(const Stmt *stmt,
-                                 const ProgramState *state,
-                                 ExplodedNode *pred,
-                                 bool markAsSink) {
-   ExplodedNode *node = B.generateNode(stmt, state, pred, checkerTag);
+                                 ExplodedNode *pred = 0,
+                                 const ProgramPointTag *tag = 0) {
+    assert(statement && "Only transitions with statements currently supported");
+    ExplodedNode *node = B.generateNode(statement, state,
+                                        pred ? pred : Pred,
+                                        tag  ? tag  : checkerTag);
     if (markAsSink && node)
       node->markAsSink();
     return node;